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, давайте сосредоточимся на этом, когда
разработка для хрома. "
Но теперь, в 2014 году, цикл while вернулся на хром. это в 2 раза быстрее, в других / старых браузерах оно всегда было быстрее.
В последнее время я сделал несколько новых тестов. Теперь в реальном мире эти короткие коды ничего не стоят, и jsperf не может правильно выполнить цикл while, потому что он должен воссоздать array.length, что также требует времени.
вы не можете получить фактическую скорость цикла while на jsperf.
вам нужно создать свою собственную функцию и проверить это с помощью window.performance.now()
И да ... цикл пока просто не быстрее.
Настоящая проблема на самом деле - манипуляция домом / время рендеринга
время рисования или как хочешь его назвать.
Например, у меня есть сцена холста, где мне нужно вычислить координаты и столкновения ... это делается между 10-200 микросекундами (не миллисекундами). для рендеринга всего требуется несколько миллисекунд. То же, что и в DOM.
НО
Существует еще один супер производительный способ использования for loop
в некоторых случаях ... например, для копирования / клонирования массива
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
один.
Примечание: ;
очень важно после for 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 /