Паттерны программирования и PHP
2989 повідомлень
#15 років тому
Я проще сделал for ($i = 1; $i <= 100000; $i++) $arr = $i + 100;
2989 повідомлень
#15 років тому
А размер массива увеличить не удасться 
Можно повторить цикл несколько раз, но соотношения принципиально не изменяться.
1172 повідомлення
#15 років тому
Не надо ассициативного, я не в ту сторону посмотрел. Надо увеличить количество итераций до 10 млн. и учитывать, что microtime не реагирует на смену секунды, т.е. время выполнения в 1.5 сек = 0.5 сек.
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, результат не меняется почти.
1172 повідомлення
#15 років тому
Такие очень редко. Смысл замеров в другом. Тут явно видно, что <count(...) тратит время и сильно ухудшает читабельность. For без count обгоняет Foreach на длинных дистанциях, но недостаточно далеко, чтобы нельзя было пожертвовать этими тысячнми долями процента ради повышения читабельности с Foreach. А сейчас замерю скорость этих двоих на множестве коротких дистанций.
2989 повідомлень
#15 років тому
Ну чтож, можно сказать на коротких циклах лучше себя показал foreach, на длинных $c= count(). А соотношения примерно остались.Но как часто Вам приходиться перебирать такие массивы? И еще Вам ведь надо куда-то данные запихнуть. Поэтому время иттерации будет скорее всего значительно меньше времени обработки.
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)
Про такое не знал...так везде можно писать?