Fast Site Engine

Высокопроизводительная CMS для сайтов.

Сделать сайт

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

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

Скачать
О движкеПроизводительностьБезопасностьТехнические требованияSEOКонтакты

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 на каком-нить синтетическом тесте без обращения к массиву.



© Все права защищены 2004 - 2024