2014 While
вернулся
Просто подумай логично.
Посмотри на это
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Необходимо создать как минимум 2 переменные (индекс, длина)
- Необходимо проверить, меньше ли индекс длины
- Нужно увеличить индекс
for
цикл имеет 3 параметра
Теперь скажите мне, почему это должно быть быстрее, чем:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Одна переменная
- Нет проверок
- индекс уменьшается (машины предпочитают это)
while
имеет только один параметр
Я был совершенно сбит с толку, когда Chrome 28 показал, что цикл for быстрее, чем какое-то время. Это должно быть бен какой-то
«Все используют цикл for, давайте сосредоточимся на этом при разработке для chrome».
Но теперь, в 2014 году, цикл while вернулся на хром. это в 2 раза быстрее, в других / старых браузерах это всегда было быстрее.
В последнее время я сделал несколько новых тестов. Теперь в реальном мире эти короткие коды ничего не стоят, и jsperf не может правильно выполнить цикл while, потому что он должен воссоздать array.length, что также требует времени.
Вы не можете получить фактическую скорость цикла while на jsperf.
вам нужно создать свою собственную функцию и проверить это с помощью window.performance.now()
И да ... нет, пока цикл просто быстрее.
Настоящая проблема на самом деле заключается в манипуляциях с dom / времени рендеринга / времени рисования или как вы хотите это назвать.
Например, у меня есть сцена холста, где мне нужно вычислить координаты и столкновения ... это делается между 10-200 микросекундами (не миллисекундами). для рендеринга всего требуется несколько миллисекунд. То же, что и в DOM.
НО
В loop
некоторых случаях есть еще один суперэффективный способ использования for ... например, для копирования / клонирования массива.
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Обратите внимание на настройку параметров:
- То же, что и в цикле while, я использую только одну переменную
- Необходимо проверить, больше ли индекс, чем 0;
- Как вы можете видеть, этот подход отличается от обычного цикла for, который все используют, так как я делаю вещи внутри 3-го параметра, а также уменьшаю непосредственно внутри массива.
Сказал, что это подтверждает, что машины, как -
написав, что я думаю сделать его немного короче и удалить некоторые ненужные вещи, я написал этот в том же стиле:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Даже если он короче, похоже, что использование еще i
одного раза все замедляет. Это на 1/5 медленнее, чем предыдущий for
цикл и while
один.
Примечание:;
очень важно после того , как для looo без{}
Даже если я только что сказал вам, что jsperf не лучший способ протестировать скрипты ... я добавил эти 2 цикла здесь
http://jsperf.com/caching-array-length/40
А вот еще один ответ о производительности в JavaScript
https://stackoverflow.com/a/21353032/2450730
Этот ответ, чтобы показать эффективные способы написания JavaScript. Так что если вы не можете прочитать это, спросите, и вы получите ответ или прочитаете книгу о javascript http://www.ecma-international.org/ecma-262/5.1/