重いぞ、returnさん。
「リファレンス、またがんばる。」にて
return の処理の重さについて、気になっていた訳ですが。
今日、昼休みに
のほほんとコーヒーを味わいながら考えてたら
良い比較になりそうな、テストルーチンを思いついたので
帰宅してから実験してみた。
main
#/usr/bin/perl -wuse strict;
use Time::HiRes;
my $timecheck = Time::HiRes::time;
my $checkTimes = $ARGV[1] =~ /^[0-9]+$/ ? $ARGV[1] : 100;
for (1..$checkTimes) {
呼び出し側
}
print Time::HiRes::time - $timecheck."\n";
exit;
sub test {
呼び出され側
}
パターン1
呼び出し側
&test();
呼び出され側
print "test\n";
パターン2
呼び出し側
print &test();
呼び出され側
return "test\n";
つまり、パターン2の方だけ、
わざわざ「test\n」って文字列を return してから
print しているんだけど。
これを$checkTimesを100にして
交互に呼び出すのを100回やって平均値を出したら…
■パターン1
0.000725365
■パターン2
0.001099396
…これがビックリ。
パターン1のが 0.000374031 も速かったのでした。
うぉー、そんなに重いのかよ、returnさん!
やっぱり、どんな関数も内部的に何やってるのか
ちゃんとしっかり把握しておくべきだよね。
return も、軽く想像すると、確かに重そうなんだけど
「どうして?」って理屈を、
ちゃんと明確に人様に説明出来るようにならなきゃな。