Цикл for или while эффективности

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

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

сравнить с:

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

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

8 ответов


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


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

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

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


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


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

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

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

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

Я надеюсь, что имеет смысл и поможет.


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


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

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


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

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


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

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

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

Циклы :

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

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

Циклов While :

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

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

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