В своей книге Даже более быстрые веб-сайты Стив Саундерс пишет, что простой способ улучшить производительность цикла - уменьшить итератор до 0 а не увеличиваться по отношению к общей длине (на самом деле глава была написана Николасом К. Закасом). Это изменение может привести к экономии до 50% от первоначального времени выполнения, в зависимости от сложности каждой итерации. Например:
var values = [1,2,3,4,5];
var length = values.length;
for (var i=length; i--;) {
process(values[i]);
}
Это почти идентично для цикла for
, цикла do-while
и цикла while
.
Мне интересно, какая причина для этого? Зачем так быстро сокращать итератор? (меня интересует техническая информация об этом, а не в тестах, подтверждающих это утверждение.)
EDIT: На первый взгляд используемый здесь синтаксис цикла выглядит неправильно. Нет length-1
или i>=0
, поэтому дайте понять (я тоже был смущен).
Вот общий синтаксис цикла:
for ([initial-expression]; [condition]; [final-expression])
statement
-
начальное выражение -
var i=length
Это объявление переменной сначала оценивается.
-
условие -
i--
Это выражение оценивается перед каждой итерацией цикла. Он будет уменьшать переменную до первого прохождения через цикл. Если это выражение оценивается как
false
, цикл заканчивается. В JavaScript0 == false
, поэтому, еслиi
окончательно равно0
, оно интерпретируется какfalse
, и цикл завершается. -
Окончательное выражение
Это выражение оценивается в конце каждой итерации цикла (перед следующей оценкой состояния). Он здесь не нужен и пуст. Все три выражения являются необязательными в цикле for.
Синтаксис for loop не является частью вопроса, но, поскольку он немного необычен, мне кажется, что это интересно прояснить. И, возможно, одна из причин, по которой это происходит быстрее, потому что она использует меньше выражений (трюк 0 == false
).