Как правило, нет никакой разницы в скорости между тремя функциями.
Для предоставления результатов тестирования, чтобы продемонстрировать эффективность различных методов, используемых для итерации по массиву, от 1 to 10,000
.
Результаты тестов различных версий PHP: https://3v4l.org/a3Jn4
while $i++: 0.00077605247497559 sec
for $i++: 0.00073003768920898 sec
foreach: 0.0004420280456543 sec
while current, next: 0.024288892745972 sec
while reset, next: 0.012929201126099 sec
do while next: 0.011449098587036 sec //added after terminal benchmark
while array_shift: 0.36452603340149 sec
while array_pop: 0.013902902603149 sec
Принимает во внимание индивидуальные звонки на count
с while
и for
$values = range(1, 10000);
$l = count($values);
$i = 0;
while($i<$l){
$i++;
}
$l = count($values);
for($i=0;$i<$l;$i++){
}
foreach($values as $val){
}
Приведенные ниже примеры использования while
демонстрируют, как это будет использоваться менее эффективно во время итерации.
При функциональной итерации по массиву и поддержании текущей позиции; while
становится намного менее эффективным, так как next()
и current()
вызываются во время итерации.
while($val = current($values)){
next($values);
}
Если текущее позиционирование массива не важно, вы можете вызвать reset()
или current()
до итерации.
$value = reset($values);
while ($value) {
$value = next($values);
}
do ... while
- это альтернативный синтаксис, который можно использовать также в сочетании с вызовом reset()
или current()
до итерации и перемещением вызова next()
в конец итерации.
$value = current($values);
do{
}while($value = next($values));
array_shift
также может быть вызван во время итерации, но это отрицательно сказывается на производительности, поскольку array_shift
переиндексирует массив каждый раз, когда он вызывается.
while($values){
array_shift($values);
}
В качестве альтернативы array_reverse
может быть вызвано до итерации вместе с вызовом array_pop
. Это позволит избежать повторного индексирования при вызове array_shift
.
$values = array_reverse($values);
while($values) {
array_pop($values);
}
В заключение, скорость while
, for
и foreach
должна быть не вопросом, а вопросом, что делается внутри них для поддержания позиционирования массива.
Терминальные тесты выполняются на PHP 5.6.20 x64 CLI NTS: