Цикл 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
не является большой проблемой, потому что современные компиляторы могут генерировать один и тот же машинный код для обоих циклов, а во-вторых, оба цикла требуют одинаковых операций:
- инициализация переменной счетчика.
- условие теста.
- инкремент / декремент в переменной счетчика.
В общем, вы должны использовать for loop
в коде по следующим причинам:
- увеличить читаемость вашего кода.
- чтобы улучшить ремонтопригодность вашего кода, так как все три основные части цикла, т. е. инициализация, инкремент / декремент и условие тестирования записываются в одной строке(в большинстве случаев).
- это ограничивает область встречных переменных лучше, чем
while loop
, следовательно, это помогает в лучшем управлении памятью.
Я надеюсь, что имеет смысл и поможет.
Это будет немного зависеть от языка, возможно, и, возможно, от компилятора, но большинство современных компиляторов будут относиться к ним точно так же, и не будет никакой разницы.
подумайте о главном отличии как стиль: с for
цикл, вам не нужно искать начальное значение, порог и приращение.
также намного проще сделать бесконечный цикл из while
потому что вы забыли, чтобы увеличить.
Ну, если цикл большой и сложный, это не будет иметь значения, так как накладные расходы кода цикла (for или while) будет очень низким...
в любом случае, если вы действительно хотите знать, я думаю, это до вас, чтобы проверить в вашей IDE, в ассемблерный код. или вы можете использовать лицемер, чтобы посмотреть себя в исполняемом файле. http://www.caesum.com/files/borg228.zip (предупреждение: обычно много вздутия .exe, так что удачи!)
Как упоминалось во всех ответах здесь, любой приличный компилятор скомпилировал бы оба цикла в один и тот же машинный код.
ваш машинный код (принимая MIPS в качестве ex) будет кучей обычных операторов сборки, за которыми следует ветвь (onequal/notequal) в обоих случаях, что делает вашу эффективность согласованной.
однако вы можете обсудить проблему стиля кодирования здесь (не эффективность).
Циклы :
- используется, когда вы точно знаете, сколько раз цикл будет работать. Случай выхода известен.
- знайте по количеству, на которое ваш цикл будет увеличиваться на каждой итерации
*вероятное использование: когда коллекция элементов уже существует, и вы хотите просмотреть ее и получить количество раз, когда появляется определенное свойство.
Циклов While :
вы не знаете, сколько раз цикл будет работать. Существует случай выхода, который устанавливается/достигается когда-то во время выполнения цикла (если вы хотите имитировать цикл for, вы будете использовать что-то вроде счетчика (дополнительный код))
Не знаю, на сколько ваш цикл будет приращение. Ваш приращение / следующий шаг может быть установлен динамически. Хотя вы можете сделать это в цикле for, вам придется учитывать приращение на каждой итерации, а также вызывать некоторый нечитаемый код, которого можно избежать, если вы используете некоторое время петля.
*вероятное использование: захват потока для некоторых данных. Вы не знаете, как долго поток, поэтому ваш случай выхода, когда поток заканчивается. Поскольку это поток, и вы можете получать данные строка за строкой, вы можете пропустить белые линии, что делает ваши приращения не согласованными.