Pull to refresh

Оптимизация кода [Actionscript].

Reading time2 min
Views2.8K
Каждый раз, начиная новый проект, многие из нас задаются вопросом, а как же лучше написать ту или иную часть кода. В данной статье я попробовал собрать свои наблидения, советы на форумах по оптимизации кода на AS.

Надеюсь эти советы будут полезны и для вас.

Формирование цикла:
1) В AS 3.0 самый быстрый цикл
var i:int = 0
while(i &lt 9999999) {
i+=1 // именно i+=1
}

за счет типизации в AS 3.0 наблюдается очень большое ускорение. В AS 2.0 такого не наблюдалось.

2) Если нет разницы, в какой последовательности пробегать по массиву, то самый быстрый способ формирования цикла будет:
var i = my_array.length;
for(i--){
// здесь действия над элементом массива my_array[i]
}

3) for… in работает намного медленнее чем for.


Приведенная ниже функция быстрее, чем встроенная Array.reverse() на процентов 40-50:
function reverse(a:Array){
  var l = 0;
   var r = a.length-1;
   var t;
   while(l<r){
     t = a[l];
     a[l] = a[r];
     a[r] = t;
     ++l;
     --r;
   }
}



with притормаживает, потому что бегает по with-хэшу, затем по localvar-хэшу, затем по this-хэшу. Одним беганием больше. А ведь в this и with сидят ключи не только переменных, но и функций.
with object {

}

(особенно если много обращений к св-вам и методам object'а) сильно замедляет алгоритм.
Лучше отказаться от его использования.


В больших циклах старайтесь избегать использование методов и… массивов.

obj.x+=1 // где obj — экземпляр класса, в котом объевлен член x // с точным типом var x:Number;

В AS 3.0, сработает на порядок быстрее, чем

obj['x']+=1 // где obj, массив

В AS 1.0/2.0 разницы не замечено.


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


Лучше создавать промежуточные переменные для хранения адресов на хэш. То есть обращение типа
xxx.tr.mx.v+=xxx.tr.mx.dv

лучше привести к следующему:
var mx:Object=xxx.tr.mx;
mx.v+=mx.dv;

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


Array.length тормозной, так что лучше сначала узнать его длину в переменную перед началом цикла.


Math.random в 2-3 раза медленнее работает чем random.


a=b=c=0 быстрее чем a=0; b=0; c=0;.


Key.isDown(Key.SPACE) медленне чем Key.isDown(32).


Избегайте использование this.


Синтаксис 4-ого Flash’а быстре чем обращение через “.”.


Сохраняйте константные функции в локальные переменные var Mpi=Math.PI.


Используйте var для определения переменнных.


Используйте i++ и i-- вместо i+=1 и i-=1.


Используйте где возможно – вместо +.


Определение координат MC гораздо быстрее определляется таким образом:
backgroundMC._x = int(computedXposition);
backgroundMC._y = int(computedYposition);

Чем таким:
backgroundMC._x = computedXposition;
backgroundMC._y = computedYposition;


Если есть какие-нибудь дополнения можете поделится с остальными.
Tags:
Hubs:
+3
Comments3

Articles

Change theme settings