Для Loop или While Loop - Эффективность - PullRequest
8 голосов
/ 18 ноября 2010

Это может быть глупым вопросом, но как эффективность цикла while сравнивается с эффективностью цикла for?Меня всегда учили, что если вы можете использовать цикл for, тогда я должен.Но в чем разница между:

$i = 0;
while($i < 100) {
     echo $i;
     $i++;
} 

по сравнению с:

for($i = 0; $i < 100; $i++) {
    echo $i;
}

Я знаю, что в этих конкретных примерах разница составляет как .000000001%, но когда мы говорим о большихсложные петли, в чем разница?

Ответы [ 8 ]

11 голосов
/ 18 ноября 2010

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

Причина (по крайней мере, в данном случае) предпочитать конструкцию for над while не имеет ничегоделать с эффективностью;Все дело в написании кода, который выражает ваши намерения в понятной и простой для понимания форме.

* for помещает начальное условие, приращение и условие выхода в одном месте, облегчая понимание.Петля while распространяет их вокруг.Например, в вашем примере, каково начальное значение i?- о, ты забыл это указать?- вот в чем дело.

4 голосов
/ 18 ноября 2010

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

4 голосов
/ 18 ноября 2010

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

3 голосов
/ 27 сентября 2012

Разница в производительности между for loop и while loop не является большой проблемой, поскольку современные компиляторы могут генерировать один и тот же машинный код для обоих циклов, а во-вторых, оба цикла требуют одинаковых операций:

  1. Инициализация переменной счетчика.
  2. Условия испытаний.
  3. Увеличение / уменьшение переменной счетчика.

Как правило, вы должны использовать for loop в своем коде по следующим причинам:

  1. Для повышения читабельности вашего кода.
  2. Для улучшения удобства сопровождения вашего кода, поскольку все три основные части цикла, то есть инициализация, приращение / уменьшение и условие теста, записаны в одной строке (в большинстве случаев).
  3. Он ограничивает область действия переменных счетчика лучше, чем while loop, поэтому он помогает улучшить управление памятью.

Надеюсь, это имеет смысл и поможет.

2 голосов
/ 18 ноября 2010

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

1 голос
/ 28 июня 2014

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

Ваш машинный код (принимая MIPS в качестве примера) будет представлять собой набор нормальных операторов сборки, за которыми следуетветвь (onequal / notequal) в обоих случаях, обеспечивающая согласованность вашей эффективности.

Однако вы можете обсудить проблему стиля кодирования здесь (не эффективность).

Для циклов:

  1. Используется, когда вы точно знаете, сколько раз будет выполняться цикл.Известен случай выхода.
  2. Знайте, на какую величину ваш цикл будет увеличиваться на каждую итерацию

* Возможное использование: когда коллекция элементов уже существует и вы хотитепросмотреть его и узнать, сколько раз появляется определенное свойство.

Во время цикла:

  1. Вы не знаете, сколькораз цикл будет работать.Существует сценарий выхода, который устанавливается / достигается когда-то во время работы цикла (если вы хотите смоделировать цикл for, вы будете использовать что-то вроде счетчика (дополнительный код))

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

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

1 голос
/ 18 ноября 2010

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

В любом случае, если вы действительно хотите знатьЯ думаю, это зависит от вас, чтобы проверить ваш ide, в ассемблерном коде.или вы можете использовать диссамблер, чтобы заглянуть в исполняемый файл.http://www.caesum.com/files/borg228.zip (предупреждение: в .exe обычно много раздувания, так что удачи!)

1 голос
/ 18 ноября 2010

Думайте о главном различии как о стиле: с циклом for вам не нужно искать начальное значение, порог и приращение.

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

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