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

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

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

    Формирование цикла:
    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;


    Если есть какие-нибудь дополнения можете поделится с остальными.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 3

      0
      почему this следует избегать?
        0
        Потому что используется поиск в подхэше this, тоже самое что, если в руте писать _root.varname (ну почти тоже самое :) ).
        Тоесть, как было описанно в одном из выше перечисленных пунктах, надо избегать вообще обращения к переменным через точку.
        0
        Спасибо! Очень полезно.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое