Что является более эффективным в Javascript: в то время как или для утверждений? - PullRequest
7 голосов
/ 14 августа 2011

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

 var i = foo.length;
 while(i--){

 }

или

 for(var i=0 ;i<=foo.length;i++){

 }

Я хочу знать от ребят из javascript, какой из них эффективнее использовать и при каких обстоятельствах мы должны использовать их соответственно. Это та же причина, что и в Java или что-то другое.

Ответы [ 6 ]

9 голосов
/ 14 августа 2011

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

7 голосов
/ 14 августа 2011

В некоторых браузерах некоторые способы зацикливания выполняются быстрее - например, в Chrome цикл for более чем в два раза быстрее, но во всех браузерах нет единого победителя.Если вы найдете способ сделать его действительно быстрым в одном браузере, вы будете наказаны за это в другом браузере.

Фактический тест производительности в разных браузерах: http://jsperf.com/for-or-while

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

4 голосов
/ 24 октября 2016

вот хороший тест различных циклов с точки зрения производительности: http://jsben.ch/#/BQhED

4 голосов
/ 14 августа 2011

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

например, while(i<100) медленнее, чем while(i--)

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

var fooLength = foo.length;
 for(var i=0 ;i<= fooLength;i++){

 }
4 голосов
/ 14 августа 2011

For-loop являются синтаксическим сахаром для while-циклов. Они должны быть точно такими же.

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

for (var i = foo.length; i--;) { }
0 голосов
/ 14 августа 2011

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

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