Разные приемы по оптимизации

Для объекта TextField используйте метод appendText() вместо оператора += .

При работе со свойством text класса TextField используйте метод appendText() вместо оператора += . Использование метода appendText() позволяет оптимизировать производительность.

Для примера в следующем коде используется оператор += , и выполнение цикла занимает 1120 мс.

addChild ( myTextField ); 
  
myTextField.autoSize = TextFieldAutoSize.LEFT; 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.text += "ActionScript 3"; 
} 
  
trace( getTimer() - started ); 
// output : 1120 

В следующем примере вместо оператора += используется метод appendText() .

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.appendText ( "ActionScript 3" ); 
} 
 
trace( getTimer() - started ); 
// output : 847 

Теперь выполнение кода занимает 847 мс.

По возможности обновляйте текстовые поля вне циклов.

Можно выполнить дальнейшую оптимизацию этого кода с помощью простого приема. Для внутренней обработки обновления текстового поля внутри каждого цикла используются значительные ресурсы. За счет сцепления строки и ее присвоения текстовому полю вне цикла существенно уменьшается время выполнения кода. Теперь выполнение кода занимает 2 мс.

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
 
var started:Number = getTimer(); 
var content:String = myTextField.text; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "ActionScript 3"; 
} 
  
myTextField.text = content; 
  
trace( getTimer() - started ); 
// output : 2 

При работе с текстом HTML используемый ранее подход был настолько медленным, что в некоторых случаях мог порождать исключение Timeout в проигрывателе Flash Player. Например, исключение могло быть создано, если используемое аппаратное обеспечение было недостаточно производительно.

Примечание. В среде Adobe® AIR® такое исключение не создается.
var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.htmlText += "ActionScript <b>2</b>"; 
} 
 
trace( getTimer() - started ); 

За счет присвоения значения строке вне цикла выполнение кода занимает всего 29 мс.

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
var content:String = myTextField.htmlText; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "<b>ActionScript<b> 3"; 
} 
  
myTextField.htmlText = content; 
  
trace ( getTimer() - started ); 
// output : 29 
Примечание. В проигрывателях Flash Player 10.1 и AIR 2.5 был усовершенствован класс String, поэтому для строк используется меньше памяти.
По возможности избегайте использования оператора квадратной скобки.

Использование оператора квадратной скобки может привести к снижению производительности. Избежать его использования можно путем хранения ссылки в локальной переменной. Следующий пример кода демонстрирует неэффективное использование оператора квадратной скобки.

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i].x = Math.random()*stage.stageWidth; 
    arraySprite[i].y = Math.random()*stage.stageHeight; 
    arraySprite[i].alpha = Math.random(); 
    arraySprite[i].rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 16 

Следующая оптимизированная версия позволяет по возможности избежать использования оператора квадратной скобки.

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
var currentSprite:Sprite; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    currentSprite = arraySprite[i]; 
     currentSprite.x = Math.random()*stage.stageWidth; 
     currentSprite.y = Math.random()*stage.stageHeight; 
     currentSprite.alpha = Math.random(); 
     currentSprite.rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 9 
По возможности встраивайте код для уменьшения числа вызовов функций в коде.

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

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = Math.abs ( currentValue ); 
} 
  
trace( getTimer() - started ); 
// output : 70

Вычисление с помощью метода Math.abs() можно выполнить вручную и встроить.

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = currentValue > 0 ? currentValue : -currentValue; 
} 
  
trace( getTimer() - started ); 
// output : 15

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

Примечание. Размер кода оказывает существенное влияние на работу проигрывателя в целом. Если в приложении значительные объемы кода ActionScript, виртуальная машина потратит много времени на его проверку и JIT-компиляцию. Поиск свойств может выполняться медленнее из-за большого количества уровней иерархии и из-за того, что на обработку внутреннего кэша тратится неоправданно много ресурсов. Для сокращения размера кода не используйте среду Adobe® Flex®, библиотеку среды TLF и другие объемные библиотеки ActionScript от независимых разработчиков.
Не оценивайте операторы в цикле.

Еще одним приемом оптимизации является отказ от оценки оператора в каждом цикле. Следующий код выполняет итерации в массиве, но не является оптимизированным, поскольку длина массива оценивается в каждой итерации.

for (var i:int = 0; i< myArray.length; i++) 
{ 
}

Лучше сохранить значение и использовать его повторно.

var lng:int = myArray.length; 
 
for (var i:int = 0; i< lng; i++) 
{ 
}
Используйте обратный порядок для циклов while.

В обратном порядке циклы while выполняются быстрее, чем в прямом.

var i:int = myArray.length; 
 
while (--i > -1) 
{ 
}

Это лишь некоторые примеры оптимизации кода ActionScript, наглядно демонстрирующие, что даже одна строка может серьезно влиять на производительность и использование памяти. Возможны и многие другие способы оптимизации кода ActionScript. Дополнительные сведения см. на странице http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/ .