Добрый день. Что быстрее работает 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*
* Все приведенные значения времени в статье являются среднеарифметическим от результатов исследования.
хочу рассказать про несколько других способов обойти массив. А именно функции array_walk и iterator_apply.
Для ленивых foreach вне конкуренции.
Суть теста
Создается массив с 1000000 (одним миллионом) элементов (числа от 1 до 1000000) и кормим этот массив функциям.
$array = range(1,1000000);
$a = null;
ob_start();
/*
array_walk($array,function($v,$k){
echo $v;
});
//*/
/*
$it = new ArrayIterator($array);
iterator_apply($it, function(Iterator $iterator){
echo $iterator->current();
return true;
}, array($it));
//*/
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)
Первый вариант вариант — функция array_walk.
array_walk($array,function)
Результат — 0.80s*
Второй вариант вариант — функция array_walk.
iterator_apply($it, function)
Результат — 1.20s*
Если не инициализировать итератор (допустим он у нас уже есть), то результат будет следующим — 1.00s*
Не большая победа.
* Все приведенные значения времени в статье являются среднеарифметическим от результатов исследования.