Оптимизация циклов в Javascript :: часть 2
Дата публикации: 11.03.2012
Объединение циклов
Если несколько циклов работают, которые работают по одному и тому же интервалу, можно выполнить их объединение (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.
