АСѾԐД Создание и продвижение сайтов

Fast Site Engine

CMS для сайтов

Создать сайт

Карта сайта
Переходим на Линукс
Политика конфиденциальности
Сделать сайт на основе Fast Site Engine

Установка
Документация
Список изменений
Лицензионное соглашение

Скачать
О движкеОбо мнеДеятельностьПортфолиоКонтакты

while vs foreach vs for что быстрее в php

Один из самых важных и "узких" моментов, скорость работы массива. По массиву меню в процессе построения функции могут пробегать по многу раз, соответственно крайне важно чтоб этот момент работал на максимуме возможностей. давайте разберёмся всю ли правду пишут нам в интернете, какой массив работает быстрее while vs foreach vs for. Часть тестов не несут осмысленной нагрузки - ради интереса добавлены. Каждый тест перезапускался несколько раз.
Необходимо понимать, что тест имеет перекос в сторону обращения к двумерному массиву.

$a=array(
0=>array(0=>'top')
,1=>array(0=>'top')
,2=>array(0=>'top')
,3=>array(0=>'top')
,4=>array(0=>'top')
,5=>array(0=>'left')
,6=>array(0=>'left')
,7=>array(0=>'left')
,8=>array(0=>'left')
,9=>array(0=>'left')
);
в функциях function f1(){global $a; ..
1.
foreach($a as $v){
  if($v[0]=='right'){}
}
2.
foreach($a as $k => $v){
  if($v[0]=='right'){}
}
3.
for($i=0; $i<count($a); ++$i){
  if($a[$i][0]=='right'){}
}
4.
$c=count($a);
for($i=0; $i<$c; ++$i){
  if($a[$i][0]=='right'){}
}
5.
$c=count($a)-1;
for($i=$c; $i>0; --$i){
  if($a[$i][0]=='right'){}
}
6.
reset($a);
while(list($k, $v) = each($a)){
  if($v[0]=='right'){}
}
7.
reset($a);
while(list(, $v) = each($a)){
  if($v[0]=='right'){}
}
8.
$i=0;
while($i<count($a)){
  if($a[$i][0]=='right'){}
  ++$i;
}
9.
$i=0;
$c=count($a);
while($i<$c){
  if($a[$i][0]=='right'){}
  ++$i;
}
10.
$i=count($a)-1;
while($i>-1){
  if($a[$i][0]=='right'){}
  --$i;
}
11.
$i=count($a)-1;
while($i>=0){
  if($a[$i][0]=='right'){}
  --$i;
}

Результаты тестирования скорости массивов в PHP

Компьютер:
вызовов / функциявремябыстрее на
11 / foreach($a as $v)0.000018+0.000006 с.+33.33 %
21 / foreach($a as $k => $v)0.0000120.000000 с.0 %
31 / for($i=0; $i<count($a); ++$i)0.000036+0.000024 с.+66.67 %
41 / $c=count($a); for($i=0; $i<$c; ++$i)0.000014+0.000002 с.+14.29 %
51 / $c=count($a)-1; for($i=$c; $i>0; --$i)0.000022+0.000010 с.+45.45 %
61 / reset($a); while(list($k, $v) = each($a))0.000029+0.000017 с.+58.62 %
71 / reset($a); while(list(, $v) = each($a))0.000035+0.000023 с.+65.71 %
81 / $i=0; while($i<count($a))0.000028+0.000016 с.+57.14 %
91 / $i=0; $c=count($a); while($i<$c)0.000021+0.000009 с.+42.86 %
101 / $i=count($a)-1; while($i>-1)0.000013+0.000001 с.+7.69 %
111 / $i=count($a)-1; while($i>=0)0.000021+0.000009 с.+42.86 %
Сервер:
вызовов / функциявремябыстрее на
11 / foreach($a as $v)0.000014+0.000005 с.+35.71 %
21 / foreach($a as $k => $v)0.0000090.000000 с.0 %
31 / for($i=0; $i<count($a); ++$i)0.000035+0.000026 с.+74.29 %
41 / $c=count($a); for($i=0; $i<$c; ++$i)0.000012+0.000003 с.+25 %
51 / $c=count($a)-1; for($i=$c; $i>0; --$i)0.000020+0.000011 с.+55 %
61 / reset($a); while(list($k, $v) = each($a))0.000023+0.000014 с.+60.87 %
71 / reset($a); while(list(, $v) = each($a))0.000036+0.000027 с.+75 %
81 / $i=0; while($i<count($a))0.000026+0.000017 с.+65.38 %
91 / $i=0; $c=count($a); while($i<$c)0.000021+0.000012 с.+57.14 %
101 / $i=count($a)-1; while($i>-1)0.000012+0.000003 с.+25 %
111 / $i=count($a)-1; while($i>=0)0.000023+0.000014 с.+60.87 %

В порядке возрастания

Компьютер:
вызовов / функциявремябыстрее на
21 / foreach($a as $k => $v)0.0000120.000000 с.0 %
101 / $i=count($a)-1; while($i>-1)0.000013+0.000001 с.+7.69 %
41 / $c=count($a); for($i=0; $i<$c; ++$i)0.000014+0.000002 с.+14.29 %
11 / foreach($a as $v)0.000018+0.000006 с.+33.33 %
91 / $i=0; $c=count($a); while($i<$c)0.000021+0.000009 с.+42.86 %
111 / $i=count($a)-1; while($i>=0)0.000021+0.000009 с.+42.86 %
51 / $c=count($a)-1; for($i=$c; $i>0; --$i)0.000022+0.000010 с.+45.45 %
81 / $i=0; while($i<count($a))0.000028+0.000016 с.+57.14 %
61 / reset($a); while(list($k, $v) = each($a))0.000029+0.000017 с.+58.62 %
71 / reset($a); while(list(, $v) = each($a))0.000035+0.000023 с.+65.71 %
31 / for($i=0; $i<count($a); ++$i)0.000036+0.000024 с.+66.67 %
Сервер:
вызовов / функциявремябыстрее на
21 / foreach($a as $k => $v)0.0000090.000000 с.0 %
101 / $i=count($a)-1; while($i>-1)0.000012+0.000003 с.+25 %
41 / $c=count($a); for($i=0; $i<$c; ++$i)0.000012+0.000003 с.+25 %
11 / foreach($a as $v)0.000014+0.000005 с.+35.71 %
51 / $c=count($a)-1; for($i=$c; $i>0; --$i)0.000020+0.000011 с.+55 %
91 / $i=0; $c=count($a); while($i<$c)0.000021+0.000012 с.+57.14 %
61 / reset($a); while(list($k, $v) = each($a))0.000023+0.000014 с.+60.87 %
111 / $i=count($a)-1; while($i>=0)0.000023+0.000014 с.+60.87 %
81 / $i=0; while($i<count($a))0.000026+0.000017 с.+65.38 %
31 / for($i=0; $i<count($a); ++$i)0.000035+0.000026 с.+74.29 %
71 / reset($a); while(list(, $v) = each($a))0.000036+0.000027 с.+75 %

Выводы

Много где пишут, что foreach медленнее остальных циклов, при этом тесты проводят только через foreach($a as $v). Отдельно в следующий раз протестирую что же быстрей for, while на каком-нить синтетическом тесте без обращения к массиву.





17.07.2026
18.8.7534 от С.М.З.Х.
Unix time: 1784323122
© Все права защищены 2004 - 2026