Created
October 28, 2012 06:34
-
-
Save mackee/3967880 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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% -- |
それ、numeralsが破壊的操作されてませんか?
#!/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
#!/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
!/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;
},
};
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