Подтвердить что ты не робот

Javascript для эффективности цикла

Есть

for (var i=0, cols=columns.length; i<cols; i++) { ... }

более эффективен, чем

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

?

Во втором варианте вычисляется columns.length каждый раз, когда проверяется условие i<columns.length?

4b9b3361

Ответ 1

Любое выражение, которое во второй части a будет оцениваться один раз за цикл.

Итак, здесь, с вашим вторым предложением, да, columns.length будет вычисляться каждый раз, когда условие проверяется - это сделает первое предложение быстрее второго.


(Это верно для многих других языков, кстати)

Ответ 2

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

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

Ответ 3

Кашированная версия работает быстрее, но вторая версия более безопасна.

Если вам просто интересно, какие типы циклов быстрей, вы можете проверить это: http://blogs.oracle.com/greimer/resource/loop-test.html

Ответ 4

Обратите внимание, что для большинства из этих циклов требуется дополнительный оператор в цикле для фактического извлечения i-го элемента из массива. Вы можете избежать этого и получить очень быстрый цикл со следующим вариантом, который использует тот факт, что Javascript просто возвращает undefined (который оценивается как false), если вы обращаетесь к массиву с индексом вне границ (а не с повышением ошибка):

for (var я = 0, col; col = columns [i]; ++ i) {...}

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

Ответ 5

Да, это так. Доступ к свойству length отнимает ненужное время (если длина массива не изменится во время итерации.).

Вот как я просматриваю массивы: http://gist.github.com/339735