[...]
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/