Я просто просматривал ответы на разные вопросы, чтобы узнать больше. Я видел ответ, в котором говорится, что плохой практикой в php писать
для ($ I = 0; $ г <подсчет ($ массив); $ я ++)
В нем говорится, что вызов функции count в цикле снижает скорость кода. Обсуждение в комментариях по этому вопросу было неясным. Я хочу знать, почему это не хорошая практика. Каким должен быть альтернативный способ сделать это?
Вы должны сделать это вместо этого:
$count = count($array); for($i=0;$i<$count;$i++)...
Причина этого заключается в том, что если вы поместите count($array)
внутри цикла for, тогда функция count должна будет вызываться для каждой итерации, которая замедляет скорость.
Однако, если вы поместите счет в переменную, это статическое число, которое не нужно пересчитывать каждый раз.
Для каждой итерации PHP проверяет эту часть цикла ( условие ), чтобы увидеть, должен ли он продолжать цикл, и каждый раз, когда он его проверяет, он вычисляет длину массива.
Простой способ кэшировать это значение …
for($i=0,$count=count($array);$i<$count;$i++) { ... }
Вероятно, это не обязательно в небольших циклах, но может иметь огромное значение при повторении нескольких тысяч элементов и зависит от того, какой вызов функции находится в состоянии (и как он определяет его возвращаемое значение).
Вот почему вы должны использовать foreach() { ... }
если можете, он использует итератор на копии массива, чтобы перебрать цикл по множеству, и вам не нужно беспокоиться о кешировании состояния цикла.
Я слышал о базе данных в хирургии врача, которая сделала именно эту ошибку с помощью программного обеспечения. Он был протестирован примерно с 100 записями, все отлично работало. В течение нескольких месяцев он имел дело с миллионами записей и был совершенно непригодным для использования, требуя минут для загрузки результатов. Код был заменен в соответствии с приведенными выше ответами, и он отлично работал.
Чтобы подумать об этом по-другому, довольно мощный выделенный сервер, который не делает ничего другого, займет около 1 наносекунды, чтобы делать счет ($ array). Если у вас было 100 циклов, каждый из которых подсчитывал 1000 строк, то это всего лишь 0,0001 секунды.
Тем не менее, это 100 000 вычислений для КАЖДОЙ загрузки страницы. Масштабировать, что до 1 000 000 пользователей (и кто не хочет иметь 1 миллион пользователей?) … делает 10-страничную загрузку, и теперь у вас есть расчеты на 1 000 000 000 000 (1 триллион). Это наложит много нагрузки на сервер. Это 1000 секунд (около 16,5 минут), которые ваш процессор тратит на выполнение этого кода.
Теперь увеличьте время, затрачиваемое машиной на обработку кода, количество элементов в массивах и количество циклов в коде … вы говорите о буквально многих триллионах процессов и многочасовом времени обработки, что можно избежать, просто сначала сохранив результат в переменной.
Это не хорошая практика, потому что, как написано, count($array)
будет вызываться каждый раз через цикл. Предполагая, что вы не будете изменять размер массива в цикле (что само по себе было бы ужасной идеей), эта функция всегда будет возвращать одно и то же значение, а повторное его повторение избыточно.
Для коротких циклов разница, вероятно, не будет заметной, но лучше всего вызвать функцию один раз и использовать вычисленное значение в цикле.