forの条件分にcount関数をいれちゃ、ダメ、ゼッタイ。

こんにちは。
久しぶりにITのこととか書こうかな。

foreach ちょっと遅いから、なるべくforを使いたいなー
と、思いつつコードを書くことが多いですが、、、ぼんやりしているとついつい

 

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

とかしちゃいません?


だめ、ぜったい。

今回は、これが実際にどんだけ遅いのかを計測してみました。

 

$checkSrc = array();
for ($i = 0; $i < 20000; $i++) {
$checkSrc[$i] = ['id' => rand(1000000, 9999999), 'uid' => "AbCdEfG".strval($i)];
}
$checktime1 = microtime(true);
$checkForeach = array();
foreach ($checkSrc as $k => $v) {
$checkForeach[$checkSrc[$k]['id']] = ['id' => $checkSrc[$k]['id'], 'character_id' => $checkSrc[$k]['character_id']];
}
$checktime2 = microtime(true);
$checkFor2 = array();
$cnt = count($checkSrc);
for ($i = 0; $i < $cnt; $i++) {
$checkFor2[$checkSrc[$i]['id']] = ['id' => $checkSrc[$i]['id'], 'character_id' => $checkSrc[$i]['character_id']];
}
$checktime3 = microtime(true);
$checkFor1 = array();
for ($i = 0; $i < count($checkSrc); $i++) {
$checkFor1[$checkSrc[$i]['id']] = ['id' => $checkSrc[$i]['id'], 'character_id' => $checkSrc[$i]['character_id']];
}
$checktime4 = microtime(true);

$chk1 = $checktime2-$checktime1;
echo 'foreach time : '.$chk1;
$chk2 = $checktime3-$checktime2;
echo 'for time : '.$chk2;
$chk3 = $checktime4-$checktime3;
echo 'for+count time : '.$chk3;

 

 

‌‌$chk1 = $checktime2-$checktime1;
‌0.015005826950073

‌‌$chk2 = $checktime3-$checktime2;
‌0.01128101348877

‌‌$chk3 = $checktime4-$checktime3;
‌0.12991309165955

 

foreach は forより30%程度遅いです。

 

さて・・・・うっかりforの条件にcountを入れると・・・

入れていないパターンより 1100%遅く、foreachより800%ほど遅いです。

 

だめ、ぜったい。