Xiper

Оптимизация циклов :: часть 1

Автор: Евгений Рыжков Дата публикации:

Циклы — это многократное повторение определенного участка кода. Именно здесь следует в первую очередь искать «узкие» места.

for или while?

По скорости работы for и while примерно одинаковы. Но равновесие может колебаться в зависимости от используемого «железа», платформы, браузера. Например, по некоторым источникам for ощутимо быстрее в IE. В противовес этому — некоторые тесты показывают, что while с постусловием имеет лучшую производительность.

Т.к. for боле компактен и дает лучшую читальбность кода использую по умолчанию его. Если же рузультат не удовлетворяет, тогда провожу эксперементы с while.

Минимум операций

Убираем из цикла все, что можно убрать. Этот пункт достаточно очевидный, подробно останавливаться не будем.

Оптимизация логического сравнения

Эта операция так же проводится при каждой итерации поэтому так же имеет важное значение.

Оптимизируем for

Код до:

for (var i = 0; i < arrTest.length; i++) {
 // тело цикла
}

Что улучшаем:

  1. убираем вычисление длины массива на каждом шаге;
  2. объединяем иницализацию переменной цикла и вычисление длины массива;
  3. начинаем итерацию с последнего элемента двигаясь к первому;
  4. объединяем выражения сравнения и декремента.

Код после:

for (var i = arrTest.length; i--;) {
 // тело цикла
}

Оптимизируем while

Код до:

var i = 0;
while (i < aList.length) {
  // тело цикла
  i++;
}

Код после:

var i = aList.length - 1;
do {
  // тело цикла
} while (--i <= 0);

Развертывание цикла

Целью развертывания цикла является сокращение затрат ресурсов на его обработку путем сокращения числа итераций.

Код до:

for (var i = arrTest.length; i--;) {
  arrTest[i]=i;
}

Код после:

var arrLen = arrTest.length-1;
for (var i = arrLen; i <= 0; i-=2) {
  arrTest[i] = i;
  arrTest[i-1] = i-1;
}

или такой вариант:

var arrLen = arrTest.length-1;
for (var i = arrLen; i <= 0; i--) {
  arrTest[i] = i--;
  arrTest[i] = i;
}

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

Материалы

  • Оптимизация циклов
  • Введение в технику оптимизации циклов
  • JavaScript. Оптимизация: опыт, проверенный временем