swuecho
10/3/2014 - 9:25 PM

bench_if_and_map.pl

#!/usr/bin/env perl
use v5.10;

use Benchmark qw(cmpthese timethese);

my $dsid = 1;

sub name_to_number {
    my $name = shift;
    if ( $name = 'rock' ) {
        return 0;
    }
    elsif ( $name = 'spock' ) {
        return 1;
    }
    elsif ( $name = 'paper' ) {
        return 2;
    }
    elsif ( $name = 'lizard' ) {
        return 3;
    }
    elsif ( $name = 'scissors' ) {
        return 4;
    }
    else {
        return "your choice is wrong";
    }
}

my %map = (
    rock     => 0,
    spock    => 1,
    paper    => 2,
    lizard   => 3,
    scissors => 4
);

sub name_to_number_map {
    my $name = shift;
    return $map{$name} || "your choice is wrong";
}
my $n =  1_000_000;
say $n;
cmpthese(
    $n,
    {
        func => sub { name_to_number('rock') },
        map  => sub { name_to_number_map('rock') },
    }
);
$n = 10_000_000;
say $n;
cmpthese(
    $n ,
    {
        func => sub { name_to_number('rock') },
        map  => sub { name_to_number_map('rock') },
    }
);

timethese(
    1_000_000,
    {
        func => sub { name_to_number('rock') },
        map  => sub { name_to_number_map('rock') },
    }
  )

__END__
1000000
            (warning: too few iterations for a reliable count)
          Rate func  map
func 2500000/s   -- -12%
map  2857143/s  14%   --
10000000
          Rate func  map
func 2336449/s   --  -6%
map  2475248/s   6%   --
Benchmark: timing 1000000 iterations of func, map...
      func:  1 wallclock secs ( 0.40 usr +  0.00 sys =  0.40 CPU) @ 2500000.00/s (n=1000000)
       map:  1 wallclock secs ( 0.42 usr +  0.00 sys =  0.42 CPU) @ 2380952.38/s (n=1000000)