
これを見て、一般的な場合はどうだったかが気になった。
TokuLog 改め Perl を極めて結婚するブログ - アホにもわかる memcached の get_multi がなぜ速いかについての解説$m->get_multi("a", "b", "c") すると、{a => $m->get("a"), b => $m->get("b"), c => $m->get("c")} と同じ結果が得られるんだけど、get_multi の方が圧倒的に速い。
それで、ベンチマークしてみたのが、以下の結果。scalarでもlistでも結果を返す関数に対して、一つ一つ代入するのと、リストで一度に代入するのとどちらが速いかを比較してみた。ここで使った関数は、sub{ wantarray ? @_ : $_[0] }
という、最もシンプルな関数なので、この件に関しては考えられうる限り最も純粋なベンチマークになっているはずだ。
#!/usr/local/bin/perl use strict; use warnings; use Benchmark qw/cmpthese timethese/; our $DEBUG = 0; my $bd; my $elems = shift || 10; if ($DEBUG) { require B::Deparse; $bd = B::Deparse->new; } sub echo { wantarray ? @_ : $_[0] } { my $assign_scalar = "sub{ "; $assign_scalar .= "my \$x$_ = echo($_);" for ( 1 .. $elems ); $assign_scalar .= " }"; *assign_scalar = eval $assign_scalar; die $@ if $@; warn $bd->coderef2text( \&assign_scalar ) if $DEBUG; } { my $decl = join ",", map { '$x' . $_ } ( 1 .. $elems ); my $args = join ",", ( 1 .. $elems ); my $assign_list = "sub{ my ($decl) = echo($args) }"; *assign_list = eval $assign_list; die $@ if $@; warn $bd->coderef2text( \&assign_list ) if $DEBUG; } cmpthese( timethese( 0, { scalar => \&assign_scalar, list => \&assign_list, } ) );
「ものすごく速い」という場合は、このベンチマークの結果とも照合する必要があるだろう。このグラフが考えられる限りの最低限ということになる。
余談であるが、「まわす」のあて字として、この手の記事に「輪姦」を当てるというのははっきりいって面白くなく不快なだけ。Perl Mongersはテストステロン過剰なヤロウばかりではない。言葉を慎みたれたし。
Dan the Perl Monger
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。