Skip to content

Instantly share code, notes, and snippets.

@mackee
Created October 28, 2012 06:34
Show Gist options
  • Save mackee/3967880 to your computer and use it in GitHub Desktop.
Save mackee/3967880 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use DDP;
use 5.012;
use Benchmark qw/:all/;
my @numerals = qw/zero one two three four five six seven eight nine ten/;
cmpthese -1, {
'for and incremental index' => sub {
my %numeral_to_number = ();
my $i = 0;
for my $numeral (@numerals) {
$numeral_to_number{$numeral} = $i++;
}
},
'for and 0..10' => sub {
my %numeral_to_number = ();
for my $value (0..10) {
$numeral_to_number{$numerals[$value]} = $value;
}
},
'for and 0..scalar()' => sub {
my %numeral_to_number = ();
for my $value (0..@numerals-1) {
$numeral_to_number{$numerals[$value]} = $value;
}
},
'for and keys' => sub {
my %numeral_to_number = ();
for my $number (keys @numerals) {
$numeral_to_number{$numerals[$number]} = $number;
}
},
'while and each' => sub {
my %numeral_to_number = ();
while (my ($number, $numeral) = each(@numerals)) {
$numeral_to_number{$numeral} = $number;
}
},
'map and shift' => sub {
my @numerals_copy = @numerals;
my %numeral_to_number = map { $_ => shift @numerals_copy } 0..10;
},
'List::MoreUtil::zip' => sub {
use List::MoreUtils qw/zip/;
my @indexes = (0..10);
my %numeral_to_number = zip(@numerals, @indexes);
},
};
__END__
Rate map and shift List::MoreUtil::zip while and each for and keys for and 0..scalar() for and 0..10 for and incremental index
map and shift 110276/s -- -14% -22% -40% -44% -46% -49%
List::MoreUtil::zip 128478/s 17% -- -9% -30% -35% -37% -41%
while and each 140894/s 28% 10% -- -23% -28% -31% -35%
for and keys 183794/s 67% 43% 30% -- -6% -10% -15%
for and 0..scalar() 196495/s 78% 53% 39% 7% -- -4% -9%
for and 0..10 204485/s 85% 59% 45% 11% 4% -- -6%
for and incremental index 216392/s 96% 68% 54% 18% 10% 6% --
@kenjiskywalker
Copy link

!/usr/bin/env perl

use strict;
use warnings;
use utf8;

use DDP;
use 5.012;
use Benchmark qw/:all/;

my @numerals = qw/zero one two three four five six seven eight nine ten/;

cmpthese -1, {
'map' => sub {
my @indexes = (0..10);
my %numeral_to_number = map { $_ => shift @numerals } @indexes;
},

'for and 0..10' => sub {
    my %numeral_to_number = ();
    for my $value (0..10) {
        $numeral_to_number{$numerals[$value]} = $value;
    }
},

'for and 0..scalar()' => sub {
    my %numeral_to_number = ();
    for my $value (0..@numerals-1) {
        $numeral_to_number{$numerals[$value]} = $value;
    }
},

'for and keys' => sub {
    my %numeral_to_number = ();
    for my $number (keys @numerals) {
        $numeral_to_number{$numerals[$number]} = $number;
    }
},

'while and each' => sub {
    my %numeral_to_number = ();
    while (my ($number, $numeral) = each(@numerals)) {
        $numeral_to_number{$numeral} = $number;
    }
},

'List::MoreUtil::zip' => sub {
    use List::MoreUtils qw/zip/;
    my @indexes = (0..10);
    my %numeral_to_number = zip(@numerals, @indexes);
},

};

END
Rate List::MoreUtil::zip map for and keys for and 0..scalar() for and 0..10 while and each
List::MoreUtil::zip 103384/s -- -20% -37% -41% -42% -96%
map 129737/s 25% -- -21% -26% -28% -95%
for and keys 163839/s 58% 26% -- -7% -9% -93%
for and 0..scalar() 175812/s 70% 36% 7% -- -2% -93%
for and 0..10 179709/s 74% 39% 10% 2% -- -93%
while and each 2479740/s 2299% 1811% 1414% 1310% 1280% --
perl for_hash.pl 11.91s user 0.35s system 99% cpu 12.275 total

@mackee
Copy link
Author

mackee commented Oct 28, 2012

それ、numeralsが破壊的操作されてませんか?

@kenjiskywalker
Copy link

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use DDP;
use 5.012;
use Benchmark qw/:all/;

my @numerals = qw/zero one two three four five six seven eight nine ten/;

cmpthese -1, {
    'map' => sub {
        my @indexes = (0..10);
        my %numeral_to_number = map { $_ => shift @numerals } @indexes;
    },

    'for and 0..10' => sub {
        my %numeral_to_number = ();
        for my $value (0..10) {
            $numeral_to_number{$numerals[$value]} = $value;
        }
    },

    'for and 0..scalar()' => sub {
        my %numeral_to_number = ();
        for my $value (0..@numerals-1) {
            $numeral_to_number{$numerals[$value]} = $value;
        }
    },

    'for and keys' => sub {
        my %numeral_to_number = ();
        for my $number (keys @numerals) {
            $numeral_to_number{$numerals[$number]} = $number;
        }
    },

    'while and each' => sub {
        my %numeral_to_number = ();
        while (my ($number, $numeral) = each(@numerals)) {
            $numeral_to_number{$numeral} = $number;
        }
    },

    'List::MoreUtil::zip' => sub {
        use List::MoreUtils qw/zip/;
        my @indexes = (0..10);
        my %numeral_to_number = zip(@numerals, @indexes);
    },
};


                         Rate List::MoreUtil::zip   map for and keys for and 0..scalar() for and 0..10 while and each
List::MoreUtil::zip  103384/s                  --  -20%         -37%                -41%          -42%           -96%
map                  129737/s                 25%    --         -21%                -26%          -28%           -95%
for and keys         163839/s                 58%   26%           --                 -7%           -9%           -93%
for and 0..scalar()  175812/s                 70%   36%           7%                  --           -2%           -93%
for and 0..10        179709/s                 74%   39%          10%                  2%            --           -93%
while and each      2479740/s               2299% 1811%        1414%               1310%         1280%             --
perl for_hash.pl  11.91s user 0.35s system 99% cpu 12.275 total

@kenjiskywalker
Copy link

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use DDP;
use 5.012;
use Benchmark qw/:all/;

my @numerals = qw/zero one two three four five six seven eight nine ten/;

cmpthese -1, {
    'for and 0..10' => sub {
        my %numeral_to_number = ();
        for my $value (0..10) {
            $numeral_to_number{$numerals[$value]} = $value;
        }
    },

    'for and 0..scalar()' => sub {
        my %numeral_to_number = ();
        for my $value (0..@numerals-1) {
            $numeral_to_number{$numerals[$value]} = $value;
        }
    },

    'for and keys' => sub {
        my %numeral_to_number = ();
        for my $number (keys @numerals) {
            $numeral_to_number{$numerals[$number]} = $number;
        }
    },

    'while and each' => sub {
        my %numeral_to_number = ();
        while (my ($number, $numeral) = each(@numerals)) {
            $numeral_to_number{$numeral} = $number;
        }
    },

    'List::MoreUtil::zip' => sub {
        use List::MoreUtils qw/zip/;
        my @indexes = (0..10);
        my %numeral_to_number = zip(@numerals, @indexes);
    },

    'map' => sub {
        my @indexes = (0..10);
        my @hoge = @numerals;
        my %numeral_to_number = map { $_ => shift @hoge } @indexes;
    },

};

__END__
                        Rate  map while and each List::MoreUtil::zip for and keys for and 0..scalar() for and 0..10
map                  75983/s   --           -31%                -32%         -41%                -54%          -58%
while and each      109887/s  45%             --                 -2%         -15%                -34%          -39%
List::MoreUtil::zip 111709/s  47%             2%                  --         -14%                -33%          -38%
for and keys        129152/s  70%            18%                 16%           --                -22%          -28%
for and 0..scalar() 166134/s 119%            51%                 49%          29%                  --           -8%
for and 0..10       180326/s 137%            64%                 61%          40%                  9%            --

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment