Xiper

Оптимизация циклов в 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
  • Введение в технику оптимизации циклов
  • Оптимизация (информатика)

По теме