Евгений О.
2989 повідомлень
#15 років тому
Я проще сделал for ($i = 1; $i <= 100000; $i++) $arr = $i + 100;
Евгений О.
2989 повідомлень
#15 років тому
А размер массива увеличить не удасться . Больше 100 000 элементов не дает вписать.
Можно повторить цикл несколько раз, но соотношения принципиально не изменяться.
Андрей К.
1172 повідомлення
#15 років тому
Не надо ассициативного, я не в ту сторону посмотрел. Надо увеличить количество итераций до 10 млн. и учитывать, что microtime не реагирует на смену секунды, т.е. время выполнения в 1.5 сек = 0.5 сек.
Евгений О.
2989 повідомлень
#15 років тому
Я там выше приписал.
Андрей К.
1172 повідомлення
#15 років тому
Инкремент настолько быстрая операция, что изменится.
Андрей К.
1172 повідомлення
#15 років тому
В общем не буду вас мучить, сам напишу сейчас.
Евгений О.
2989 повідомлень
#15 років тому
Да нет смысла. Просто я хотел показать, что на 100 000 итераций разница составляет 0,03 - 0,05 с. Так стоит огород городить?
Андрей К.
1172 повідомлення
#15 років тому
Вот код:


<?php
$test = array();
for($i = 0; $i < 1000000; $i++)
$test = 'str' . rand(0, 1000);

echo "For with count<br />";
$counter = 0;
$start = time() + microtime();
for($i = 0; $i < count($test); $i++)
$counter++;
$end = time() + microtime();
echo $end - $start . '<br /><br />';

echo "For without count<br />";
$counter = 0;
$start = time() + microtime();
$num=count($test);
for($i = 0; $i < $num; $i++)
$counter++;
$end = time() + microtime();
echo $end - $start . '<br /><br />';

echo "Foreach<br />";
$counter = 0;
$start = time() + microtime();
foreach($test as $value)
$counter++;
$end = time() + microtime();
echo $end - $start;
?>


Вот результаты:


For with count
0.277402877808

For without count
0.104125022888

Foreach
0.149585962296



For with count
0.275177001953

For without count
0.103945016861

Foreach
0.150637865067



For with count
0.278805017471

For without count
0.104306936264

Foreach
0.150763988495


Раз 20, результат не меняется почти.
Евгений О.
2989 повідомлень
#15 років тому
Сколько раз Вы тест прогнали?
Андрей К.
1172 повідомлення
#15 років тому
Такие очень редко. Смысл замеров в другом. Тут явно видно, что <count(...) тратит время и сильно ухудшает читабельность. For без count обгоняет Foreach на длинных дистанциях, но недостаточно далеко, чтобы нельзя было пожертвовать этими тысячнми долями процента ради повышения читабельности с Foreach. А сейчас замерю скорость этих двоих на множестве коротких дистанций.
Евгений О.
2989 повідомлень
#15 років тому
Ну чтож, можно сказать на коротких циклах лучше себя показал foreach, на длинных $c= count(). А соотношения примерно остались.
Но как часто Вам приходиться перебирать такие массивы? И еще Вам ведь надо куда-то данные запихнуть. Поэтому время иттерации будет скорее всего значительно меньше времени обработки.
Алексей С.
115 повідомлень
#15 років тому
Андрей К.
1172 повідомлення
#15 років тому

<?php
$test = array();
for($i = 0; $i < 10; $i++)
$test = 'str' . rand(0, 1000);

echo "For without count<br />";
$timers = array();
for($i=0;$i<5000000;$i++) {
$counter = 0;
$start = time() + microtime();
$num=count($test);
for($j = 0; $j < $num; $j++)
$counter++;
$timers = time() + microtime() - $start;
}
echo array_sum($timers) . '<br /><br />';

echo "Foreach<br />";
$timers = array();
for($i=0; $i < 5000000; $i++) {
$counter = 0;
$start = time() + microtime();
$num=count($test);
foreach($test as $value)
$counter++;
$timers = time() + microtime() - $start;
}
echo array_sum($timers);
?>



For without count
14.418197155

Foreach
11.8852367401


Вот собственно и ответ. При небольших массивах foreach даже быстрее. Поэтому стоит выбрать тот, который будет в данном случае просто-напросто читабельнее.
А если взять случай, когда индексы не по порядку идут, то кроме foreach других вариантов и нет. Наверное, поэтому я и написал про него в 20:46.
Евгений О.
2989 повідомлень
#15 років тому
Великие ипытания! Может на Нобелевскую подать? Но мой вывод пока не поколебали - эта ловля блох ни дает никакого реального изменения потому, что любая последующаю обработка сожрет всю экономию.
Андрей К.
1172 повідомлення
#15 років тому
Цитата ("elosoft"):
Но мой вывод пока не поколебали - эта ловля блох ни дает никакого реального изменения потому, что любая последующаю обработка сожрет всю экономию.

Его и не надо колебать, вполне правильный вывод для данного случая, а все эти тесты только для развлечения. Но делать count на каждой итерации не стоит при любых раскладах, он как минимум делает код плохо читаемым.
В своей практике я чаще всего использую foreach и while, а чистый for использую достаточно редко, т.к. он читается чуточку хуже.

Цитата ("elosoft"):
любая последующаю обработка сожрет всю экономию

Не сожрет, просто сделает незаметной. Поэтому тут важна уже не скорость, а читабельность.
Евгений О.
2989 повідомлень
#15 років тому
Я тоже предпочитаю foreach, правда в основном по другой причине - не надо таскать за собой переменную цикла и всегда можно получить ключи.
Алексей С.
115 повідомлень
#15 років тому
Цитата ("elosoft"):
Но мой вывод пока не поколебали - эта ловля блох

Мне без блох куда удобней...
Это просто один раз берётся в привычку и потом не думается ... просто пишется со всеми поправками на оптимизацию.

Для меня уже дикость использовать двойные кавычки...просто как-то не привычно
Андрей К.
1172 повідомлення
#15 років тому
trueW3C, а как насчет блохи в 144байт памяти? ))))))))))))))))))
Ровно настолько foreach требует больше в наших тестах))

Но представьте, что у вас есть матрица, внутри которой хранится достаточно большой участок памяти. При foreach каждая такая ячейка копируется в переменную. Тут выиграет либо for, либо конструкция foreach($var as &$value).
Алексей С.
115 повідомлень
#15 років тому
Цитата:
TrueW3C, а как насчет блохи в 144байт памяти?)

Ну...

foreach($var as &$value)

Про такое не знал...так везде можно писать?
Андрей К.
1172 повідомлення
#15 років тому
Везде, где требуется.


Я например использую, когда передаю большие массивы в функцию. Вместо клонирования данных. Но чревато риском затереть реальные данные, если забудете, что это не локальная переменная, а ссылка на участок памяти.