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:

  1. 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;
  2. meglio scrivere i = i*0.5 piuttosto che i = i/2;
    anche se la scelta ideale è lo shift, cioè i >> 1
  3. 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;
  4. Per i loop la scelta più veloce (tra i vari for, for each, while) è:

    var i:int = array.length;
    while( --i > -1){
     // iterazione
    }
    
  5. 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;

  6. un incremento “++i” è più veloce di “i++”, quindi in un for è meglio scrivere:

    for (var i:int; i< n; ++i){}
    
  7. in as3 il tipo base int è ottimizzato dentro i loop, quindi è meglio definire le variabili int in un loop, invece di Number o uint
  8. se vuoi "swappare" due variabili senza crearne una terza usa lo xor come segue:

    a = a^b;
    b = a^b;
    a = a^b;
    
  9. 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;
    }
    

  10. E' meglio castare con int() piuttosto che usare Math.floor() per arrotondare un Number
  11. castare sempre i valori restituiti da un array:

    for (i=0; i< n; i++){
     o.x = Object(array[i]).x;
    }
    
  12. Piuttosto di Math.abs è più performante usare la seguente istruzione di codice:

    var test:Number= nn < 0 ? nn * -1 : nn;
    
  13. 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"
    
  14. 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.

Scrivi un Commento

Home | Graffiti e Disegni | Educazione | Chi siamo | Blog | Progetti | Contatti
RSS Feed Comments RSS Accedi