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

Добрый день. Что быстрее работает 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*
Не большая победа.


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