Каждый раз, начиная новый проект, многие из нас задаются вопросом, а как же лучше написать ту или иную часть кода. В данной статье я попробовал собрать свои наблидения, советы на форумах по оптимизации кода на AS.
Надеюсь эти советы будут полезны и для вас.
Формирование цикла:
1) В AS 3.0 самый быстрый цикл
за счет типизации в AS 3.0 наблюдается очень большое ускорение. В AS 2.0 такого не наблюдалось.
2) Если нет разницы, в какой последовательности пробегать по массиву, то самый быстрый способ формирования цикла будет:
3) for… in работает намного медленнее чем for.
Приведенная ниже функция быстрее, чем встроенная Array.reverse() на процентов 40-50:
with притормаживает, потому что бегает по with-хэшу, затем по localvar-хэшу, затем по this-хэшу. Одним беганием больше. А ведь в this и with сидят ключи не только переменных, но и функций.
(особенно если много обращений к св-вам и методам object'а) сильно замедляет алгоритм.
Лучше отказаться от его использования.
В больших циклах старайтесь избегать использование методов и… массивов.
obj.x+=1 // где obj — экземпляр класса, в котом объевлен член x // с точным типом var x:Number;
В AS 3.0, сработает на порядок быстрее, чем
obj['x']+=1 // где obj, массив
В AS 1.0/2.0 разницы не замечено.
Обращение к хэшу локальных переменных быстрее чем к глобальным и уж тем более выше, если используется поиск в подхэшах. Потому при передаче данных через аргумент функции все быстрее происходит. Хэш-то получается из одной переменной состоит. Вобщем локальные переменные адресуются быстрее.
Лучше создавать промежуточные переменные для хранения адресов на хэш. То есть обращение типа
лучше привести к следующему:
тем самым мы избавляемся от двух хэш-поисков. Конечно во флэше все оптимизировано, но когда речь идет о перелопачивании огромных массивов каждое бегание по индексам хэшей вызывает тормоза.
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 гораздо быстрее определляется таким образом:
Чем таким:
Если есть какие-нибудь дополнения можете поделится с остальными.
Надеюсь эти советы будут полезны и для вас.
Формирование цикла:
1) В AS 3.0 самый быстрый цикл
var i:int = 0
while(i < 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;
Если есть какие-нибудь дополнения можете поделится с остальными.