読者です 読者をやめる 読者になる 読者になる

PGメモ

非エンジニアの記録

PHP高速化 ループ回数を減らす

ループがめちゃめちゃ増えて遅い。
なんて事があるので減らしたい、けど本当に早くなるのか。やってみた。

20万回のループを100回まわして平均をとります。


$lcount = 200000;

for($i=0;$i<100;$i++){
$r = bm('loop_1',$lcount);
$rt += $r;
$ravg_1 = $rt/$i;
}

for($i=0;$i<100;$i++){
$r = bm('loop_2',$lcount);
$rt += $r;
$ravg_2 = $rt/$i;
}

echo $ravg_1;
echo $ravg_2;

function bm($fn, $c)
{
$time_start = microtime(true);
$fn($c);
$time_end = microtime(true);
$time = $time_end - $time_start;
return sprintf("%.10f",$time);
}

1つ目の関数は普通にループ


function loop_1($c){
for($i=0;$i<$c;$i++){
$ary[$i] = $i;
}
}

2つ目の関数は中で処理をベタ書きしてループの数を減らします


function loop_2($c){
for($i=0;$i<$c;$i+=30){
$ary[$i] = $i;
$ary[$i+1] = $i+1;
$ary[$i+2] = $i+2;
$ary[$i+3] = $i+3;
$ary[$i+4] = $i+4;
$ary[$i+5] = $i+5;
$ary[$i+6] = $i+6;
$ary[$i+7] = $i+7;
$ary[$i+8] = $i+8;
$ary[$i+9] = $i+9;
$ary[$i+10]= $i+10;
$ary[$i+11] = $i+11;
$ary[$i+12] = $i+12;
$ary[$i+13] = $i+13;
$ary[$i+14] = $i+14;
$ary[$i+15] = $i+15;
$ary[$i+16] = $i+16;
$ary[$i+17] = $i+17;
$ary[$i+18] = $i+18;
$ary[$i+19] = $i+19;
$ary[$i+20] = $i+20;
$ary[$i+21] = $i+21;
$ary[$i+22] = $i+22;
$ary[$i+23] = $i+23;
$ary[$i+24] = $i+24;
$ary[$i+25] = $i+25;
$ary[$i+26] = $i+26;
$ary[$i+27] = $i+27;
$ary[$i+28] = $i+28;
$ary[$i+29] = $i+29;

}
}

さて結果は・・・

loop_1


0.19048864913131

loop_2


0.18555314131313


結果:若干早いかも。

今回は書き方もアレなのでこの程度の差ならやらなくてもよいかも。
ただ、処理によっては大幅に変わる可能性もあるので方法として覚えておくとよいのかも。