Обычно существует три метода обхода массива: for, while и foreach. Самый простой и удобный из них — foreach. Так каковы различия в работе и производительности между ними? Какой метод обычно лучше использовать?
Давайте сначала проверим время, необходимое для обхода одномерного массива с 50 000 индексами:
Тестовая платформа:
Процессор: ПМ 725
Память: 512М
Жесткий диск: 40G, 5400 об/мин.
ОС: Windows XP SP2.
тестовый код
apache 2.0.54 php5.0.4
:
<?php
/*
* @ Автор: Лилов
* @ Домашняя страница: www.codesky.com
* @ Электронная почта: [email protected]
*
*/
$arr = массив();
for($i = 0; $i <50000; $i++){
$arr[] = $i*rand(1000,9999);
}
функция GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
###############################################################################
$time_start = GetRunTime()
для ($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Использованное время для:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
###############################################################################
$time_start = GetRunTime();
while(list($key, $val) = каждый($arr)){
$стр.= $вал;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Использованное время while:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
###############################################################################
$time_start = GetRunTime()
foreach($arr as $key => $val){;
$стр.= $вал;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Время использования foreach:'.round($time_used, 7).'(s)<br><br>';
####################################
?>
Результаты теста:
усредните три результата теста:
Соответствует for, while, foreach соответственно
0,1311650
0,1666853
0,1237440
Результаты повторных тестов показывают, что для обхода одного и того же массива самым быстрым является foreach, а самым медленным — while. foreach работает примерно на 20–30 % быстрее, чем while. Затем увеличьте индекс массива до 500000 и 5000000, и результаты теста будут такими же. Но с принципиальной точки зрения foreach работает с копией массива (копируя массив), а while перемещает внутренний индекс массива. Вообще говоря, считается, что while должен быть быстрее, чем foreach (потому что). foreach сначала помещает массив, в который копируется, а while непосредственно перемещает внутренний указатель), но результат прямо противоположный. Причина должна заключаться в том, что foreach — это внутренняя реализация PHP, а while — это общая структура цикла.
Поэтому в общих приложениях я предпочитаю использовать форму foreach, которая проста и эффективна. В PHP5 foreach также может просматривать атрибуты класса.