perlでloop unrollingの効果があるのか?
Yappoがまじめなブログを書いていたので、それを読んでみた。YappoLogs: CPUの気持ちは大事だけど、VMの気持ちも考えようよ
そのネタもとのお話を読んだ。*1 ふーん、Perlでもループアンローリングの効果って、どのくらいあるのかなあ。for()の評価回数が減るけど、実行速度においては、誤差みたいなものじゃないかなあ、と思った。
そこで、perlのプログラムを書いたことない人が見よう見まねで写経してみた。
#!/usr/bin/perl use strict; use warnings; my $sum; my $start; my $end; my $max = 10000000; my $mod; $sum =0; $start = time(); for (my $i=0; $i<$max; $i++) { $sum = $sum + $i; } $end = time(); print $sum, "\n"; printf("%.4f sec\n", $end - $start); $sum = 0; $start = time(); $mod = $max - ($max % 3); for (my $i=0; $i<$mod; $i=$i+3) { $sum = $sum + $i; $sum = $sum + $i + 1; $sum = $sum + $i + 2; } for (my $i=$mod; $i<$max; $i++) { $sum = $sum + $i; } $end = time(); print $sum, "\n"; printf("%.4f sec\n", $end - $start);
実行結果
$ ./loop.pl 49999995000000 4.0000 sec 49999995000000 4.0000 sec
流石に変化なし。ループアンローリングで速くなるVM作ったら神だな。(ヒント:マルチコア)。あ、それはループアンローリングとは言わないか。でへ。
追記:id:otsuneさんに、教えてもらって、下記変更をした。
$ diff -u loop.pl~ loop.pl --- loop.pl~ 2009-03-27 14:44:52.000000000 +0900 +++ loop.pl 2009-03-27 16:20:06.000000000 +0900 @@ -2,6 +2,7 @@ use strict; use warnings; +use Time::HiRes qw ( time ); my $sum; my $start;
で結果、
$ ./loop.pl;echo '####';./loop.pl;echo '####';./loop.pl 49999995000000 3.9763 sec 49999995000000 4.5064 sec #### 49999995000000 3.9703 sec 49999995000000 4.5365 sec #### 49999995000000 3.9741 sec 49999995000000 4.4064 sec
あれ、なんで><。Perlのエラい人の解説を松。