|
|
|
| Привет! Скажите, какая конструкция работает быстрее, foreach или for? Допустим есть массив, где 2000 элементов, но индексы идут не попорядку. | |
|
|
|
|
|
|
|
для: Лёва
(07.11.2007 в 17:48)
| | а что мешает засечь время да проверить? | |
|
|
|
|
|
|
|
для: Лёва
(07.11.2007 в 17:48)
| | Смотря что делать циклом, что выводить? | |
|
|
|
|
|
|
|
для: Лёва
(07.11.2007 в 17:48)
| | Вот код теста. Результаты по 20 тестам в комментариях.
<?php
$t = array();
for($i=0; $i<=100000; $i++)
{
$t[] = $i;
}
$debuger = new Debuger;
//Начинаем замер
for($i=0; $i<=100000; $i++)
{
}
$debuger->set('for'); // результат: 0.01 - 0.0104
foreach($t as $v)
{
}
$debuger->set('foreach without keys'); // результат: 0.0093 - 0.0115
foreach($t as $k => $v)
{
}
$debuger->set('foreach with keys'); // результат: 0.0129 - 0.0141
echo $debuger->cout();
?>
|
Общий вывод: for работает стабильнее (амплитуда меньше). foreach без ключей обычно оказывался малость быстрее. | |
|
|
|
|
|
|
|
для: Лёва
(07.11.2007 в 17:48)
| | Есть любопытный момент. Мне пришло в голову, что, поскольку foreach в тесте два раза проходит один массив, второй раз может быть малость быстрее нормы.
Решил попробовать так:
<?php
$t = array();
for($i=0; $i<=100000; $i++)
{
$t[] = $i;
}
$t2 = $t; //Копия массива для второго прохода
$debuger = new Debuger;
//Начинаем замер
for($i=0; $i<=100000; $i++)
{
}
$debuger->set('for');
foreach($t as $v)
{
}
$debuger->set('foreach without keys');
foreach($t2 as $k => $v)
{
}
$debuger->set('foreach with keys');
echo $debuger->cout();
?>
|
Результат меня удивил:
показатели for и foreach с ключами, в общем, не изменились (я ожидал, что последний, возможно, сработает медленнее). Но медленней сработал foreach без ключей. Причем, в среднем, в 4 раза медленней. Что может быть причиной? С массивом $t, по-моему представлению, ничего нового не произошло. Кто-нибудь в курсе подоплеки клонирования массивов на PHP? | |
|
|
|
|
|
|
|
для: Лёва
(07.11.2007 в 17:48)
| | Простите, это я с недосыпу. Тест, конечно, кривой, т.к. for вообще не работал с массивом.
Вот вторая редакция:
<?php
$t = array();
for($i=0; $i<=100000; $i++)
{
$t[] = $i;
}
$debuger = new Debuger;
//Начинаем замер
for($i=0; $i<=100000; $i++)
{
$a = $t[$i];
}
$debuger->set('for'); // результат: 0.0212 - 0.0224
foreach($t as $v)
{
$a = $v;
}
$debuger->set('foreach without keys'); // результат: 0.0119 - 0.0143
foreach($t as $k => $v)
{
$a = $v;
}
$debuger->set('foreach with keys'); // результат: 0.0163 - 0.0182
echo $debuger->cout();
?>
|
При пробе с клонированием массива первый foreach опять работал больше 0.4 секунды. Так что вопрос остается открытым. | |
|
|
|