Как быстрее обойти массив (без ключей).

Добрый день. Что быстрее работает while, for или foreach?

Для ленивых foreach оказался быстрее.

Суть теста

Создается массив с 1000000 (одним миллионом) элементов (числа от 1 до 1000000) и кормим этот массив различным циклам.
$array = range(1,1000000);

$a = null;

ob_start();

/*
for ($i = 0; $i < count($array); $i++) {
	echo $array[$i];
}
//*/

/*
$c = count($array);
for ($i = 0; $i < $c; $i++) {
	echo $array[$i];
}
//*/

/*
foreach ($array as $e) {
	echo $e;
}
//*/

/*
echo $array[0];
while($v=next($array)){
	echo $v;
}
//*/

ob_clean();


Результаты

Тест выполнялся в виртуальной машине.
Ubuntu Server 12.04 x64, 4 vCPU, 2.0 GHz, Guaranteed CPU 20%, DDR3 ECC RAM
1333 MHz 4Gb.
PHP 5.4.6-2~precise+1

Тестирование проводилось напрямую из интерпретатора (php -f test.php)

Первый вариант — цикл for с вычислением ограничения на лету.
for ($i = 0; $i < count($array); $i++)

Результат — 0.67s*

Второй вариант — цикл for с уже вычисленным ограничением.
$c = count($array);
for ($i = 0; $i < $c; $i++)

Результат — 0.52s*

Третий вариант — цикл foreach.
foreach ($array as $e)

Результат — 0.50s*

Четвертый вариант — цикл while.
while($v=next($array))

Результат — 0.60s*


* Все приведенные значения времени в статье являются среднеарифметическим от результатов исследования.

3 комментария

avatar
Всегда использовал форич. Никогда не думал, что есть какая-то разница. Спасибо большое за материал.
avatar
P.s. есть же ещё функции типа array_walk, протестируйте пожалуйста и их.
avatar
Спасибо за идею. Написал статью о array_walk и iterator_apply.

Оставить комментарий