Ottimizzare il codice in Java



Ecco alcuni semplici suggerimenti per ottimizzare il codice, quindi per rendere più veloce l’esecuzione del programma e ridurre al minimo l’occupazione di memoria.

1) Variabili Locali e variabili Globali

L’accesso alle variabili locali è molto più veloce rispetto alle variabili globali. Quindi è sempre preferibile usare variabili dichiarate localmente e non dichiarare un’infinità di variabili globali che, anche se possono essere usate da più metodi, sono di accesso più lento.

2) Operatori Logici

E’ sempre preferibile, quando è possibile, usare && e || al posto di & e |. La differenza si noterà nell’esempio:

boolean a = false, b = true;
if (a & b) //…
if (a && b) //…

Utilizzando &&, l’if controlla se la variabile a è vera e vedendo che è falsa si ferma, perché l’operazione non può più essere vera. Invece utilizzando & vengono controllati comunque tutti e due gli operandi, impiegando quindi più tempo. La stessa cosa vale per | e ||.

3) Operazioni veloci

Come si sa, è bene utilizzare gli operatori veloci, cioè:

a=a+5 diventa a+=5
a=a-5 diventa a-=5
a=a*5 diventa a*=5
a=a/5 diventa a/=5
a=a%5 diventa a%=5

Se invece si deve incrementare o decrementare una variabile di una unità si può fare:

a++ o a–

4) Usare variabili int nei cicli

E’ sempre bene usare variabili di tipo int nei cicli perché su queste variabili le operazioni di base (addizioni e sottrazioni) risultano più veloci, ad esempio non fare:

for (long a = 0 ; a < 1000 ; a++) //…

ma fare:

for (int a = 0 ; a < 1000 ; a++) //…

Naturalmente quando questo è possibile.

5) Unrolled Loops

Esiste una particolare tecnica per ottimizzare ulteriormente i cicli. Questa si può usare quando un ciclo è ripetuto un numero di volte rispetto ad una variabile, ad esempio:

for (int i = 0 ; i < num*5 ; i++) //…

questo, applicando l’Unrolled Loops, che si potrebbe tradurre con “Srotolamento del ciclo”, diventerebbe:

for (int i = 0 ; i < num ; i+=5) {
//Istruzione con i
//Istruzione con i + 1
//Istruzione con i + 2
//Istruzione con i + 3
//Istruzione con i + 4
//Istruzione con i + 5
}

Questo ha un impatto positivo sulla velocità del codice perché si deve tener conto che ogni volta che il ciclo finisce il computer “perde tempo” a ritornare all’inizio del ciclo. Questa tecnica va comunque usata con molta prudenza, perché anche aumentando la velocità di esecuzione, fa perdere molto alla leggibilità del codice.

6) String vs StringBuffer

A volte capita di dover concatenare ripetutamente degli oggetti di tipo String, ad esempio:

String test = "";
for (int a = 0 ; a < 1000 ; a++) test += a;
return test;

Siccome gli oggetti String sono immutabili, questo fa si che ogni volta si crei un nuovo oggetto e si lasci l’altro per il Garbage Collector. Questo implica un notevole spreco di tempo, che si può evitare utilizzando StringBuffer, poiché questo permette la modifica degli oggetti rappresentati. Ecco un esempio di come diventerebbe il codice scritto prima utilizzando StringBuffer:

StringBuffer test = new StringBuffer("");
for (int a = 0 ; a < 1000 ; a++) test.append(a);
return test.toString();

Questo secondo codice è circa 11 volte più veloce del primo in cui si utilizzava String.

Queste sono alcune delle tecniche che permettono di ottimizzare il codice in modo da renderlo più veloce, ma sicuramente cercando e soprattutto provando se ne possono trovare molte altre.

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
  • rsorrt

    Saluti.

    qui
    http://www.itu.dk/~sestoft/papers/performance.pdf
    ci sono altri interessanti trucchetti per velocizzare il codice.

Pinterest