未来のいつか/hyoshiokの日記 このページをアンテナに追加 RSSフィード Twitter

2009-03-27

perlloop unrollingの効果があるのか? perlでloop unrollingの効果があるのか?を含むブックマーク 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エラい人の解説を松。

otsuneotsune 2009/03/27 15:41 use Time::HiRes qw/time/; を写経しわすれているのでtime()が秒単位の精度しか出ていないです。
あと$startとか$endもろもろはYappo(やDan Kogai blog)のようにBenchmarkモジュールを使うと記述が最小限で済みます。

hyoshiokhyoshiok 2009/03/27 16:34 otsuneさん、コメントありがとうございます。変更してみましたが、アンローリングした方が遅くなってしまいましたね。うーむ。

トラックバック - http://d.hatena.ne.jp/hyoshiok/20090327