きれいなfor文にはご用心 | PHPer Tips

PHPer Tips

日本語の情報が少ないPHPフレームワークSymfony2を中心とした話題を集めています。

[よくあるfor文の落とし穴]

慣れてくると、どんどん省略したり、ワンライナー(一行)で書けるものは、
そうしたいと考えると思います。
それによって、ソースコードが簡潔になるのは良いことです。

しかし、それにも落とし穴があります。
たとえば以下のようなコードを書いていたりしませんか?


for ($i = 0;$i < count($lists); $i++)
{

//処理


}


$i < count($lists) すると、よりまとまったように感じるかもしれませんが、
実はこれは非常に問題があります。

というのも、for文のループの回数分、count($lists)が実行されてしまうからです。

このループが1000回であれば、1000回count($lists)が実行されることになります。

面倒でも、


$counts = count($lists);
for ($i = 0;$i < $counts; $i++ )
{


}


このようにするべきでしょう。
ちなみに実際に以下のコードでどれくらい違うか計ってみましょう。


//とりあえず要素が10000個ある配列作る。
$n = 10000;
while($n--) {

$list[] = "test";

}

//中に入れる場合。
$start = microtime(true);
for ($i=0;$i <=count($list);$i++){}
$end = microtime(true);

echo $end - $start;

echo "\n";

//外に出す場合。
$start = microtime(true);

$counts = count($list);
for ($i=0;$i <=$counts;$i++){}
$end = microtime(true);

echo $end - $start;




結果は歴然
0.0017509460449219
0.0004489421844482