[...] New benchmarks about the subject:
foreach_hash_keys: 4 wallclock secs ( 4.40 usr + 0.00 sys = 4.40 CPU) @ 227272.73/s (n=1000000) foreach_hash_values: 4 wallclock secs ( 3.46 usr + 0.01 sys = 3.47 CPU) @ 288184.44/s (n=1000000) reverse_hash: 6 wallclock secs ( 6.85 usr + 0.01 sys = 6.86 CPU) @ 145772.59/s (n=1000000) Rate reverse_hash foreach_hash_keys foreach_hash_values reverse_hash 145773/s -- -36% -49% foreach_hash_keys 227273/s 56% -- -21% foreach_hash_values 288184/s 98% 27% -- New code: <code> #!env perl use strict; use warnings; use Benchmark qw(:all); sub reverse_hash { my %hash = ( dog => 'house', pig => 'barn', bird => 'cage' ); my %rhash = reverse %hash; if ( exists $rhash{house} ) { return 1; } } sub foreach_hash_keys { my %hash = ( dog => 'house', pig => 'barn', bird => 'cage' ); foreach ( keys %hash ) { if ( $hash{$_} eq 'house' ) { return 1; } } } sub foreach_hash_values { my %hash = ( dog => 'house', pig => 'barn', bird => 'cage' ); foreach ( values %hash ) { if ( $_ eq 'house' ) { return 1; } } } my $results = timethese( 1000000, { reverse_hash => \&reverse_hash, foreach_hash_keys => \&foreach_hash_keys, foreach_hash_values => \&foreach_hash_values, } ); cmpthese($results) </code>
That's a really good looking idiom, but I see it is less efficient than the foreach method. According to Benchmark: ~/Perl $ perl reverse-hash-benchmark.pl Benchmark: timing 1000000 iterations of foreach_hash, reverse_hash... foreach_hash: 3 wallclock secs ( 4.35 usr + 0.00 sys = 4.35 CPU) @ 229885.06/s (n=1000000) reverse_hash: 6 wallclock secs ( 6.81 usr + 0.01 sys = 6.82 CPU) @ 146627.57/s (n=1000000) Rate reverse_hash foreach_hash reverse_hash 146628/s -- -36% foreach_hash 229885/s 57% -- ~/Perl $ Below is the code I used: <code> #!env perl use strict; use warnings; use Benchmark qw(:all); sub reverse_hash { my %hash = ( dog => 'house', pig => 'barn', bird => 'cage' ); my %rhash = reverse %hash; if ( exists $rhash{house} ) { return 1; } } sub foreach_hash { my %hash = ( dog => 'house', pig => 'barn', bird => 'cage' ); foreach ( keys %hash ) { if ( $hash{$_} eq 'house' ) { return 1; } } } my $results = timethese( 1000000, { reverse_hash => \&reverse_hash, foreach_hash => \&foreach_hash, } ); cmpthese($results) </code> Maybe I'm doing the Benchmark in a wrong way, or is really more expensive reversing a hash than iterating its keys using foreach? -- Igor Sutton Lopes <[EMAIL PROTECTED]>
-- Igor Sutton Lopes <[EMAIL PROTECTED]> -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/