続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の内部的な仕組み(関数呼び出しの際にどういうことが行われているのか)を調べればわかるのかも。