Почему считать плохо, чем $ считать - PullRequest
7 голосов
/ 15 апреля 2011

Я просто просматривал ответы на разные вопросы, чтобы узнать больше.Я видел ответ , который говорит, что писать в php плохая практика

for($i=0;$i<count($array);$i++)

Он говорит, что вызов функции count в цикле снижает скорость кода.Обсуждение в комментариях по этому вопросу было неясным.Я хочу знать, почему это не очень хорошая практика.Каким должен быть альтернативный способ сделать это?

Ответы [ 4 ]

8 голосов
/ 15 апреля 2011

Вы должны сделать это вместо:

$count = count($array);
for($i=0;$i<$count;$i++)...

Причина для этого заключается в том, что если вы поместите count($array) внутри цикла for, то для каждого итерации потребуется вызывать функцию count.

Однако, если вы поместите счетчик в переменную, это статическое число, которое не нужно пересчитывать каждый раз.

4 голосов
/ 15 апреля 2011

Для каждой итерации PHP проверяет эту часть цикла (условие ), чтобы увидеть, должен ли он продолжать цикл, и каждый раз, когда он проверяет это, он вычисляет длину массива.

Простой способ кэшировать это значение ...

for($i=0,$count=count($array);$i<$count;$i++) { ... }

Это, вероятно, не нужно в маленьких циклах, но может иметь огромное значение при итерации по тысячамэлементов, и в зависимости от того, какой вызов функции находится в условии (и как он определяет возвращаемое значение).

По этой же причине вам следует использовать foreach() { ... }, если вы можете, он использует итератор для копиимассива для цикла по множеству, и вам не нужно беспокоиться о кэшировании условия цикла.

3 голосов
/ 15 апреля 2011

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

Если подумать иначе, довольно мощному выделенному серверу, который ничего не делает, потребуется около 1 наносекунды для подсчета ($ array). Если у вас было 100 для циклов, каждая из которых насчитывает 1000 строк, то это всего лишь 0,0001 секунды.

Однако это 100 000 расчетов для КАЖДОЙ загрузки страницы. Масштабируйте до 1 000 000 пользователей (а кто не хочет иметь 1 миллион пользователей?) ... загружая 10 страниц, и теперь у вас есть 1 000 000 000 000 (1 триллион) вычислений. Это приведет к большой нагрузке на сервер. Это 1000 секунд (около 16,5 минут), которые ваш процессор тратит на выполнение этого кода.

Теперь увеличьте время, необходимое машине для обработки кода, количество элементов в массивах и число циклов for в коде ... вы говорите буквально о многих триллионах процессов и многих часах время обработки, которого можно избежать, просто сохранив результат сначала в переменной.

1 голос
/ 15 апреля 2011

Это плохая практика, потому что, как написано, count($array) будет вызываться каждый раз через цикл. Предполагая, что вы не будете изменять размер массива в цикле (что само по себе было бы ужасной идеей), эта функция всегда будет возвращать одно и то же значение, и повторный вызов его является избыточным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...