アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、Perl入門者ですがよろしくお願いします。

質問内容はループ中にmy宣言をいちいちすると処理速度は落ちてしまうのかということです。
ソースを例に挙げると

まず、$lenをループの外に書く方法と
my $i;
my $len;
for( $i=0 ; $i<1024 ; $i++){
$len = length($str[$i];
}

$lenをループの中に書く方法
my $i;
for($i=0 ; $i<1024 ; $i++){
my $len;
$len = length($str[$i]);
}

の2種類です(その他の変数については特に言及していません)
使いやすさでいえば、ループ内で宣言をした方が自動的に初期化されるのでうれしいのですが
ふと、いちいちメモリの解放と確保を行っているわけですからOS(?)に負荷がかかって遅くなっているのではと考えました。
Perlで処理速度を測ることもできるようですが恥ずかしいながらスキル不足です。すいません。
どなたかご存知の方、自分なりの考えがある方はご教授頂きたく存じます。
よろしくお願いします。

A 回答 (1件)

質問者さんのコードで、とりあえずベンチマークを取ってみました。



質問者さんの予想通り、変数宣言をループの外(out of loop)でしたほうが、
ループの中(in loop)でするより1.5倍近く速いという結果になりました。

Benchmark: timing 10000 iterations of in loop, out of loop...
..  in loop: 4 wallclock secs ( 3.69 usr + 0.00 sys = 3.69 CPU) @ 2711.50/s (n=10000)
out of loop: 2 wallclock secs ( 2.48 usr + 0.00 sys = 2.48 CPU) @ 4025.76/s (n=10000)
        Rate  in loop out of loop
in loop .   2711/s.   --   -33%
out of loop 4026/s.   48%    --

私の環境は、以下です。

CPU:PentimuM 1.73MHz
OS:Windows XP SP2
Perl:Active Perl 5.8.8

試したコードは以下です。

use Benchmark qw(:all);

my @str = ('a'x10) x 1024;

my $r = timethese( 10000,
{
'out of loop' => sub {
my $i;
my $len;
for( $i=0 ; $i<1024 ; $i++){
$len = length($str[$i]);
}
},

'in loop' => sub {
my $i;
for($i=0 ; $i<1024 ; $i++){
my $len = length($str[$i]);
}
}
});

cmpthese $r;
    • good
    • 0
この回答へのお礼

返事が遅くなって申し訳ありません!!
回答はすぐに読ませていただきました。
非常に参考になりました。少しプログラミングの難易度は上がりますがこのあたりを気にしたプログラミングを行っていこうと思うことができました。
ありがとうございました。

お礼日時:2009/11/15 00:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!