PHP-тест операторов цикла с массивом. FOR, WHILE или FOREACH?

Решил протестировать скорость работы операторов цикла на одномерном массиве:
- оператор FOR
- оператор WHILE
- оператор FOREACH
PHP Version 5.2.5
Для примера я использовал обработку массива из 300000 элементов.
Результат:
time1: 1.4654 s
time2: 0.1526 s
time3: 0.1374 s
time1 - time2: 89.59 %
time2 - time3: 9.96 %
По результатам, на 1-ом месте оказался FOREACH, который обошел в скорости WHILE на 10%. Я был удивлен, но FOR, занявший последнее место, оказался самым медленным и отставал на 90% от оператора WHILE.
Пример PHP-кода, который я использовал для тестирования:
<?php
$arr = array();
for($i = 0; $i < 300000; $i++) $arr[] = $i;
$time_start1 = microtime(1);
$n = sizeof($arr);
for($i = 0; $i < $n; $i++) {
$a = $arr[$i];
}
$time_end1 = microtime(1);
$time1 = round($time_end1 - $time_start1, 4);
$i = 0;
$time_start2 = microtime(1);
$n = sizeof($arr);
while($i < $n) {
$a = $arr[$i];
$i++;
}
$time_end2 = microtime(1);
$time2 = round($time_end2 - $time_start2, 4);
$time_start3 = microtime(1);
foreach($arr as $key => $val) {
$a = $val;
}
$time_end3 = microtime(1);
$time3 = round($time_end3 - $time_start3, 4);
echo 'time1: ' . $time1 . ' s';
echo 'time2: ' . $time2 . ' s';
echo 'time3: ' . $time3 . ' s';
echo 'time1 - time2: ' . round((100 * ($time1 - $time2))/$time1, 2) . ' %';
echo 'time2 - time3: ' . round((100 * ($time2 - $time3))/$time2, 2) . ' %';
?>
Возможно я выбрал не универсальный вариант тестирования, но как один из основных вариантов, у него есть право на существование.
Читайте ещё похожие статьи на этом сайте:
- PHP-тест на производительность (присваивание)
- PHP-тест. Что быстрее var_export или print_r?
- PHP дробная часть числа
- PHP функция для конвертирования размеров файла (*KB, *MB, *GB)
- Автоматическая авторизация в MaxDSL через PHP-скрипт, Internet — MoldTelecom
Если Вам понравилась эта статья, пожалуйста оставьте свой комментарий или подпишитесь на RSS-канал и получайте в будущем статьи на RSS Reader.

Спасибо за тест
Думал уже сам писать
Я знал что for медленный, но не настолько
искал while vs foreach,
Но while надо было не так использовать, поэтому он и получился дольше, мне так кажется
Спасибо.
Я оттолкнулся от этого теста и дальше пошел… Думаю, тебе будет интересно посмотреть — http://j-sheridan.livejournal.com/84431.html
Вот что странно — у меня foreach на последнем месте оказался…
Для Sheridan: действительно хороший обзор получился. Хорошо, что есть люди, которым интересы даже мельчайшие но значимые детали. Одно удивляет — результат.
И чо — никто до сих пор не увидел ошибку в этом гениальном коде?
Писец оптимизаторы
Строка 8
заменить на $a = $arr[$i];
for: 0.5164 s
while: 0.0427 s
foreach: 0.0334 s
интересно почему while — foreach (стабильны) при f5
а for нет
http://www.phpbench.com/
100 повторений, длина массива 500000. Мои результаты.
Примем данный результат за 100%. Среднее время — время одного полного обхода массива.
foreach( $array as $k => $v )
{
$a = $array[$k];
// Среднее время: 0.095 сек. или 100%
}
$count = count( $array );
for( $j = 0; $j < $count; $j++ )
{
$a = $array[$j];
// Среднее время: 0.0803 сек. или 84.47%
}
$j = 0; $count = count( $array );
while( $j < $count )
{
$a = $array[$j];
$j++;
// Среднее время: 0.0779 сек. или 82.01%
}
reset( $array );
while( list( $v ) = each( $array ) )
{
$a = $v;
// Среднее время: 0.4861 сек. или 511.63%
}
foreach( $array as $v )
{
$a = $v;
// Среднее время: 0.0481 сек. или 50.63%
}
Не ожидал, что while list each щкажется с таким отставанием позади. Конечно, в подавляющем большинстве ситуаций, с которыми работатет программист разница во времени будет ничтожна мала. Но для себя я зарёкся использовать такую конструкцию (хотя и не использовал уже года 4 вообще). Как видно, не зря. хД))
[Цензура]. Почему же for медленный? Потому наверное, что внутри него доступ к элементу по константе ‘i’, а не по переменной $i.
$a = $arr[i];
Я исправил i на $i, как ты и просил. В итоге у меня ничего не изменилось (for по прежнему дольше работает):
time1: 0.1146 s
time2: 0.1065 s
time3: 0.0996 s
time1 — time2: 7.07 %
time2 — time3: 6.48 %
И совет на будущее, не будь о себе высокого мнения, будь проще и не оскорбляй людей по пустякам.
foreach рулит )
Вообще во всей более-менее сносной литературе по php говорится сразу, что foreach быстрее любого другого оператора работы с массивами, он был позже написан, при этом уже несколько более прямыми руками, чем изначально писался весь php, тут больше проблема в том, что остальные операторы никто не переписал, потому скорость их ниже, возможно все изменится в последующих редакциях php.