camel

これを見て、一般的な場合はどうだったかが気になった。

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] }という、最もシンプルな関数なので、この件に関しては考えられうる限り最も純粋なベンチマークになっているはずだ。

perl - assignment by list vs. scalar
#!/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