Migliorare le prestazioni di AS3 e Flex alleggerendo i calcoli sulla CPU – parte 2
AS3, Flex | oscar | Commenta l'articolo |
Aggiungo alla lista dell’articolo parte 1 i seguenti punti:
- in alcuni test è risultato più performante i+=1; rispetto a i++; comunque in generale i++ è la soluzione migliore. Addirittura in dei test i++ ripetuto quattro volte è più veloce di i = i + 4. La stessa cosa non sembra funzionare per i–; che risulta avere le stesse peformance del suo simile i = i – 1; o i -=1;
-
meglio scrivere i = i*0.5 piuttosto che i = i/2;
anche se la scelta ideale è lo shift, cioè i >> 1 - Il vector è 10 volte più performante dell’array, ad ogni modo arrayCollection è lentissimo, quasi 90 volte più lento, quindi va usato con molta ma molta parsimonia ed è da escludere per molti dati;
-
Per i loop la scelta più veloce (tra i vari for, for each, while) è:
var i:int = array.length; while( --i > -1){ // iterazione }
- quando bisogna dividere o moltiplicare per multipli di 2 conviene utilizzare lo shift al posto degli operatori classici:
var x:int = a*2; var y:int = b*16; var z:int = c/4; y %= 2^x // modulo con potenza del 2, tipo y % 2 o y% 4 ecc...
può essere riscritto come:
var x:int = a << 1; //2^1 = 2; var y:int = b << 4; //2^4 = 16; var z:int = c >> 2; //2^2 = 4; y &= 2^x - 1
Mai usare i bitwise con i Number, perché il Number dovrà essere prima convertito in int e poi applicare lo shift.
E’ importante sottolineare che la divisione o moltiplicazione ottenuta con lo shift troncherà il risultato, quindi “18.8” sarà “18”!
In aggiunta ricordo che è più performante scrivere i = x*0.5 piuttosto di i = x/2; -
un incremento “++i” è più veloce di “i++”, quindi in un for è meglio scrivere:
for (var i:int; i< n; ++i){}
- in as3 il tipo base int è ottimizzato dentro i loop, quindi è meglio definire le variabili int in un loop, invece di Number o uint
-
se vuoi "swappare" due variabili senza crearne una terza usa lo xor come segue:
a = a^b; b = a^b; a = a^b;
-
riutilizzare gli stessi oggetti, quindi non reistanziarne di nuovi:
cattivo esempio:for (i=0; i< n; i++){ var o = new Object(); o.x = i; }
buon esempio:
var o = new Object(); for (i=0; i< n; i++){ o.x = i; }
- E' meglio castare con int() piuttosto che usare Math.floor() per arrotondare un Number
-
castare sempre i valori restituiti da un array:
for (i=0; i< n; i++){ o.x = Object(array[i]).x; }
-
Piuttosto di Math.abs è più performante usare la seguente istruzione di codice:
var test:Number= nn < 0 ? nn * -1 : nn;
-
Divisione per 2 può essere sostituito con "n * 0.5" MOltiplicazione per 2 può essere sostituito con "n + n" Math.floor può essere sostituito con "n >> 0" Valore assoluto può essere sostituito con "if (n < 0) n = -n"
-
L'indice di un array deve essere definito come int per essere più performante e se vengono fatte operazioni del tipo.
array[i * 2];
bisogna castare ad int:array[int(i * 2)];
Al link è possibile verificare i punti elencati, infatti ci sono diversi spezzoni di codice che vengono testati, in più è possibile creare dei propri codici ad hoc, confrontarli e testare il tempo di esecuzione .
Il modo più veloce per utilizzare le operazioni è trasformarle con le operazioni di bitwise (&, | , ^), qui c'è una lista di bitwise che possono essere utilizzate anche per sostituire gli "if", il "max", il "min" e altro ancora.
Ultimi Commenti