Есть ли проблема с использованием цикла while по сравнению с циклом foreach / for? - PullRequest
1 голос
/ 06 декабря 2009

В чем проблема производительности при использовании цикла while v / s foreach / for или наоборот?

Кроме того, всегда ли предпочтительнее использовать цикл foreach v / s в php?

Ответы [ 5 ]

5 голосов
/ 06 декабря 2009

Вы указали это как «независимый от языка», но ответ будет зависеть от языка (или, скорее, от компилятора).

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

Кроме того, foreach работает для коллекции с отложенной загрузкой, обычный цикл for должен заранее знать номер элемента.

Наконец, даже если foreach немного медленнее на вашей платформе, маловероятно, что разница будет иметь значение, и она на намного более поддерживаема, чем цикл for. Не преждевременно оптимизировать. (Между прочим, так было в случае с .NET, с тех пор они увеличили производительность счетчиков.)

2 голосов
/ 20 июня 2012

Я знаю, что это лет, но мне нужно кое-что указать для будущих googlers:

"foreach" требует загрузки и завершения данных, из которых вы извлекаете данные - например, массив, который вы зациклите, уже будет в памяти.

"while" требует только одного значения (может быть data или false - продолжать ли цикл). Для правильного программирования цикла, циклу while необходимо загрузить только следующее значение, а не весь набор данных. Таким образом, если вы запрограммируете цикл while для извлечения его данных из функции, вы можете значительно сократить использование памяти.

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

псевдокод ниже объясняет:

function nextrow ()
{
  static myquery = sql_query('SELECT * FROM `hugetable`')
  return(next_row(myquery));
}
while(row = nextrow()) { ...do stuff... }
2 голосов
/ 06 декабря 2009

Гипотетически, foreach может быть медленнее - цикл for и цикл while с одинаковыми условиями должны быть эквивалентны.

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

Однако, если вы делаете это вручную в цикле for или while, то, вероятно, то же самое.

Наилучший ответ, конечно же, это попробовать, рассчитать время и посмотреть, каков на самом деле ответ.

0 голосов
/ 10 декабря 2009

Я написал статью для php | architect о самой проблеме зацикливания в PHP. По сути, тесты показывают, что при циклических затратах нет существенного влияния ... даже при использовании моего ленивого расширения числового диапазона.

IIRC, foreach в 2,9 раза медленнее, чем цикл for, если исключить память и затраты на функции генератора. Если содержимое вашего цикла составляет менее 2,9x от служебных данных цикла, то вы можете пересмотреть то, что вы делаете.

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

Большинство PHP-кодеров тратят бесчисленные циклы конкатенации строк. Это говорит о предупреждении преждевременной оптимизации. Бьюсь об заклад, я могу удвоить вашу производительность, просто добавив запятые в ваши "эхо" заявления.

Профилируйте свой код с помощью XDebug или чего-то еще. Найдите свои настоящие узкие места. Цикл не так ли. Доверьтесь мне. Это никогда не бывает.

0 голосов
/ 06 декабря 2009

Краткий ответ: нет. Бесполезно тратить впустую даже одну мысль.

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