bonar note

京都のエンジニア bonar の技術的なことや技術的でない日常のブログです。

続chop

先日のエントリーの件(関数内で@_を操作すると呼び出し元の値渡しの引数がかわる)で、@_直接操作のメリットというかいいところはないかと考えて、リファレンスを渡す場合と速度を比べてみました。

単純に変数を加算していくだけのものなのですが、こんな感じです。

#!/usr/bin/perl

use strict;
use Benchmark;

sub func_var { $_[0]++;    }
sub func_ref { ${$_[0]}++; }

my $var = 1;
my $ref = 1;

timethese(1000000, {
    'value'     => sub { func_var($var)  },
    'reference' => sub { func_ref(\$ref) },
    });

print "var=[$var] ref=[$ref]\n";

結果は

Benchmark: timing 1000000 iterations of reference, value...
 reference:  1 wallclock secs ( 0.94 usr +  0.00 sys =  0.94 CPU) @ 1063829.79/s (n=1000000)
     value:  1 wallclock secs ( 0.64 usr +  0.00 sys =  0.64 CPU) @ 1562500.00/s (n=1000000)
var=[1000001] ref=[1000001]

ということで、やはり@_直接操作の方が速いみたいですね。この違いがどこからくるのかはperlの内部的な仕組み(関数呼び出しの際にどういうことが行われているのか)を調べればわかるのかも。