昨日の記事でループ処理の事を書いたのでその続きで、
ループ内と外とで変数を宣言した時の速度の違いを調べてみました。
処理の早かった順に掲載。(「10秒間でxxx回」は当方のシステムの10秒間で実行できた回数です、他のプロセスの動作してる環境下なので誤差はあり)
1番目:10秒間に1122回
@abc=(1..1000);
my $i=0;
my $str;my $num;
foreach my $value(@abc){
$str=$value;
$num=$i++;}
ループの外で宣言を行う場合が一番早い
ループ内で変数の初期化が不要な場合
(変数が保たれるので内容をループ中で共有可能)
2番目:10秒間に822回
@abc=(1..1000);
my $i=0;
foreach my $value(@abc){
my $str=$value;
my $num=$i++;}
ループ内で宣言と同時に初期値を代入
ループ内で変数の初期化が必要な場合一番早い
※my($str,$num)=($value,$k++);を使うと2個同時にセットするともっと早く10秒間で856回になります。→ただしmy()は1つの変数を宣言する時は遅くなるので変数が複数の時のみ利用できるケース
(変数が初期化されるので内容をループ中で共有できない)
3番目:10秒間に761回
@abc=(1..1000);
my $i=0;
foreach my $value(@abc){
my $str;my $num;
$str=$value;$num=$i++;}
ループ内で宣言を行ってから初期値を代入する場合
※my($str,$num);とすると10秒間で757回に下がります。
(変数が初期化されるので内容をループ中で共有できない)
4番目:10秒間に634回
my $i=0;
@abc=(1..1000);
my $str;my $num;
foreach my $value(@abc){
$str=””;$num=0;
$str=$value;$num=$i++;
}
ループの外で宣言し、ループ内で初期化っぽい事をしてる
$str=””;$num=0;の前ならループ前の変数を再利用できるメリットがある
単純にループ先頭で初期化するなら2番目の方が早い。
(ループの途中で変数が初期化されるので、初期化前なら内容を引き継げる)
結論
変数の初期化が不要またはループ内で共有するなら1番目のループの外で宣言するのが一番早い。
ループ内で変数の初期化が必要なら2番目のループ内で宣言と同時に初期値を代入が早い。
小さなプログラムなど変数管理が簡単な物であれば、プログラムの先頭やループの無い所で全ての変数を宣言すればこの問題は無いのと同じ。
処理速度と可読性の両立は難しい。