Çeşitli en iyileştirmeler

Bir TextField nesnesi için += operatörü yerine appendText() yöntemini kullanın.

TextField sınıfının text özelliğini kullanırken, += operatörü yerine appendText() yöntemini kullanın. appendText() yöntemini kullanmak performansta iyileşme sağlar.

Örneğin, aşağıdaki kod += operatörünü kullanır ve döngü 1120 ms'de tamamlanır:

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 

Aşağıdaki örnekte, += operatörü appendText() yöntemiyle değiştirilir:

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 

Kod artık 847 ms'de tamamlanır.

Mümkünse, metin alanlarını döngülerin dışında güncelleyin.

Bu kod basit bir tekniğin kullanımıyla daha da iyileştirilebilir. Her döngüdeki metin alanını güncellemek çok fazla dahili işlenme gerektirir. Basitçe bir dize bitiştirip, ona döngünün dışındaki bir metin alanının değerini atadığınızda kodu çalıştırma süresi önemli ölçüde düşer. Artık kodun tamamlanması için 2 ms gerekir:

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 

Bir HTML metni ile çalışırken, eski yaklaşım öyle yavaştır ki bazı durumlarda Flash Player’da bir Timeout istisnası atabilir. Örneğin, temeldeki donanım çok yavaşsa bir istisna atılabilir.

Not: Adobe® AIR® bu istisnayı atmaz.
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 ); 

Değer döngünün dışındaki bir dizeye atandığında kodun tamamlanması yalnızca 29 ms sürer:

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 
Not: Flash Player 10.1 ve AIR 2.5'te, dizelerin daha az bellek kullanması için String sınıfı iyileştirilmiştir.
Mümkünse köşeli parantez operatörünü kullanmaktan kaçının.

Köşeli parantez operatörünün kullanılması performansı yavaşlatabilir: Başvurunuzu yerel bir değişkende saklayarak onu kullanmaktan kaçınabilirsiniz. Aşağıdaki kod örneği köşeli parantez operatörünün etkisiz kullanımını gösterir:

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 

Aşağıdaki en iyileştirilmiş sürüm köşeli parantez operatörünün kullanım oranını azaltır:

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 
Satır içi kodu, mümkün olduğunda, kodunuzdaki işlev çağrılarının sayısını düşürür.

İşlev çağırmak pahalı olabilir. Kod satır içini taşıyarak işlev çağrılarının sayısını azaltmayı deneyin. Kod satır içini taşımak sadece performansı artırmak üzere en iyileştirmenin iyi bir yoludur. Ancak, satır içi kod, kodunuzun yeniden kullanımını zorlaştırabilir ve SWF dosyanızın boyutunu büyütebilir. Bazı işlev çağrılarının, örneğin Math sınıfı yöntemlerinin, satır içine taşınması kolaydır. Aşağıdaki kod, mutlak değerleri hesaplamak için Math.abs() yöntemini kullanır:

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() tarafından yapılan hesaplama elle yapılabilir ve satır içine taşınabilir:

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

İşlev çağrısı satır içi sonuçlarını taşımak, kodun dört kat daha hızlı olmasını sağlar. Bu yaklaşım pek çok durumda kullanışlıdır ancak bunun yeniden kullanılabilirlik ve korunabilirlik açısından sebep olabileceği durumlara dikkat edin.

Not: Kod boyutu oynatıcının genel çalışmasının üzerinde büyük bir etkiye sahiptir. Uygulama yüksek düzeyde ActionScript kodu içeriyorsa, sanal makine kodu doğrulamak ve JIT derlemek için çok zaman harcar. Özellik aramaları, daha geniş miras hiyerarşileri nedeniyle ve dahili önbelleklerin daha fazla çalışmasından dolayı daha yavaş olabilir. Kod boyutunu azaltmak için Adobe® Flex® çerçevesini, TLF çerçevesi kütüphanesini veya herhangi bir geniş üçüncü taraf ActionScript kütüphanesini kullanmaktan kaçının.
Döngü şeklinde olan ifadeleri değerlendirmekten kaçının.

Başka bir en iyileştirme, döngü şeklinde olan bir ifadeyi değerlendirmeyerek sağlanabilir. Aşağıdaki kod bir dizi üzerinde yinelenir ancak her yineleme için dizi uzunluğu değerlendirildiğinden dolayı en iyileştirilmez.

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

Değerin depolanması ve tekrar kullanılması daha iyi bir çözümdür.

var lng:int = myArray.length; 
 
for (var i:int = 0; i< lng; i++) 
{ 
}
while döngüleri için ters sıra kullanın.

Ters sırada ilerleyen bir while döngüsü forward döngüsünden daha hızlıdır.

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

Bu ipuçları, tek satır kodun performansı ve belleği nasıl etkileyebileceğini göstererek birkaç ActionScript’i en iyileştirme yolu sağlar. Çok sayıda başka ActionScript en iyileştirmesi mümkündür. Daha fazla bilgi için şu bağlantıya bakın: http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/ .