Оптимизация циклов в Javascript :: часть 2
Объединение циклов
Если несколько циклов работают, которые работают по одному и тому же интервалу, можно выполнить их объединение (jamming). Устраняем затраты связанные с выполнением дополнительного цикла. Код до:
for (var i = arrTest.length; i--;) { arrTest[i]=i; } for (var i = arrTest2.length; i--;) { arrTest2[i]=i*2; }
Код после:
for (var i = arrTest.length; i--;) { arrTest[i]=i; arrTest2[i]=i*2; }
Данная оптимизация кажется очевидной, но это только в простых ситуациях. В более сложных вараинтах приходиться хорошо подумать каким образом объединить циклы.
Вложение больших циклов в малые
Когда имеем дело с вложенными циклами стараемся сделать внешним циклом тот у кого итераций меньше. Код до:
for(i=0; i<100; i++) { for(j=0; j<5; j++) { // какие-то действия } }
Код после:
for(j=0; j<5; j++) { for(i=0; i<100; i++) { // какие-то действия } }
В первом варианте общее число итераций равно 100 (число внешних итераций) + 5*100 (число внутренних) = 600. Для второго варианта — 5 (внешние итерации) + 5*100 (внутренние) = 505.
Размыкание цикла
Если во время выполнения цикла результат условия не изменяется, тогда цикл можно разомкнуть — поместить циклы в условие, а не условие в цикл. Код до:
for(i=0; i<100; i++) { if(something == anything) { // дейcтвие 1 } else { // действие 2 } }
Код после:
if(something == anything) { for(i=0; i<100; i++) { // дейcтвие 1 } else { for(i=0; i<100; i++) { // действие 2 } }
Про for-in
Забываем про эту конструкцию, если логика позволяет использовать обычный for: он в разы быстрее, чем for-in.
Материалы
- Тесты производительности Javascript
- Введение в технику оптимизации циклов
- Оптимизация (информатика)