これを見て、一般的な場合はどうだったかが気になった。
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
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。