use 5.012; use strict; use warnings; use Benchmark qw(:all); bench($_) for qw(10 100 1000 10000); sub bench { my ($max) = @_; my @vars = map {$_ => $_} 1..$max; say $max; cmpthese -1 => { 'no copy' => sub{ my @keys = map { $_%2 ? () : $vars[$_] } keys @vars; }, 'copy' => sub{ my @keys; my @vars_copy = @vars; while (my ($key) = splice @vars_copy, 0,2) { push @keys, $key; } }, 'lestrrat-san' => sub { my @keys; for my $i (0..$#vars/2) { push @keys, $vars[$i * 2]; } }, 'tokuhirom-san' => sub { my @keys; for (my $i=0;$i<@vars;$i+=2) { push @keys, $vars[$i]; } }, }; }
$ perl test.pl 10 Rate no copy copy tokuhirom-san lestrrat-san no copy 204799/s -- -7% -35% -42% copy 219429/s 7% -- -31% -38% tokuhirom-san 317021/s 55% 44% -- -11% lestrrat-san 355071/s 73% 62% 12% -- 100 Rate no copy copy tokuhirom-san lestrrat-san no copy 18589/s -- -14% -34% -54% copy 21525/s 16% -- -23% -46% tokuhirom-san 28128/s 51% 31% -- -30% lestrrat-san 40194/s 116% 87% 43% -- 1000 Rate no copy copy tokuhirom-san lestrrat-san no copy 1691/s -- -14% -41% -59% copy 1976/s 17% -- -31% -52% tokuhirom-san 2871/s 70% 45% -- -30% lestrrat-san 4095/s 142% 107% 43% -- 10000 Rate no copy copy tokuhirom-san lestrrat-san no copy 117/s -- -31% -65% -71% copy 170/s 46% -- -49% -57% tokuhirom-san 335/s 187% 97% -- -16% lestrrat-san 398/s 241% 134% 19% --
ツッコミお待ちしております。
・追記1
ツッコミもらったので"lestrrat-san"を追加しました。ありがとうございます!
・追記2
ツッコミもらったので"tokuhirom-san"を追加しました。ありがとうございます!