未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

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のエラい人の解説を松。