Authentication




Cancel OK
B!コメントする  2013-01-31 09:28:00 by old

for文を早くする

PHPにはfor文とうものがある。(たいていの言語にはあるけど)
こんなやつ

for( $i = 0; $i < 10; $i++ )
{
echo $i;
}


これは0から数を順番に表示していく。
よくあるやつ。
もうひとつよくあるパターンで

for( $i = 0; $i < count($j); $i++ )
{
echo $i;
}


みたいなのがある。
$jに配列なんかで格納されている場合に、その回数分やるという感じ。

で、先日なんだけどfor文の条件分にcountを使うと遅くなるというのを見た。
まぁ条件判断するたびにcountで中身を見てるんだから当たり前だな~と。
そこでどの程度違うのか見てみた。

従来

$target = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10','1', '2', '3', '4', '5', '6', '7', '8', '9', '10','1', '2', '3', '4', '5', '6', '7', '8', '9', '10');

// 開始
$timestart = microtime(true);
for( $i = 0; $i < count($target); $i++ )
{
echo $i;
}
// 終了
$time = microtime(true) - $time
start;
// 結果
echo "count" . $time . " second\n";


countをfor文の前で済ませておくパターン

$timestart2 = microtime(true);
$num = count($target);
for( $i = 0; $i < $num; $i++ )
{
echo $i;
}
// 終了
$time2 = microtime(true) - $time
start2;
// 結果
echo "jizencount " . $time2 . " second\n";


ふたつの結果は

count       0.00046300888061523 second 
jizen
count 0.00023889541625977 second


こういう結果になりました。
単純に倍の差があります。
ちなみに配列数を倍にするとさらに結果は顕著になって、どう考えてもfor文内でcountをやろうという気にならなくなるくらいの差が出ます。

count内が動的ということであれば仕方ないですが、そうでない場合はfor文の条件文の中でのさらなる処理はやめておいたほうがいいでしょう。

まぁよく考えれば当たり前のことではあるんですが、こういう感じのことがチリも積もれば処理能力の低下になってしまいますので。


PHP  

  • コメント
  • コメントはまだありません