[...]

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/


Reply via email to