Oggi ho voluto fare un test di performance molto semplice con java per cercare di migliore al massimo le performance nella esecuzione di contenuti dinamici di un sito web, senza tralasciare il discorso garbage collector. Per fare ciò ho realizzato una semplicissima classe che “spreca” un po’ di tempo nel fare operazioni inutili e l’ho fatta girare con vari settaggi. Riporto il codice sorgente della pagina di seguito è una classe semplicissima.
/* * Testperformace.java
*
* @author l.ciocci
* Created on 5 febbraio 2010, 10.09
*
* Questa è una classe di esempio per verificare le performance della JVM.
* L’idea è quella di verificare le differenze tra la jvm in configurazione
* server e quella in versione standar
*
* Provare ad eseguire con
* java -server Testperformace
*
* oppure
*
* java -client Testperformance
*/
import java.util.LinkedList;
import java.lang.StringBuffer;
public class Testperformace {
public static void main(String[] args) {
long start=System.currentTimeMillis();
LinkedList list=new LinkedList();
StringBuffer sb=new StringBuffer();
System.out.println(“Inizio l’esecuzione di Testperformance\n”);
//Perdo un po’ di tempo
for (int i=0;i<10000;i++) {
//Genero un numero casuale e lo memorizzo nella linked list
String str=new String();
sb.append(i);
str=sb.toString();
list.add(str);
//if (i%1000==0) System.out.print(“..” + i);
}
long stop=System.currentTimeMillis();
long time=stop-start;
System.out.println(“\nL’esecuzione ha impiegato: ” + time + ” millisecondi”);
}
}
La classe usa un banale conteggio dei millisecondi passati dall’inizializzazione fino al termine dell’esecuzione. La versione di java che utilizzo è la OpenJDK Runtime Environment (build 1.6.0_0-b11).
Ho fatto varie prove di esecuzione lanciando la classe con il comando: java -server Testperformace
L’esecuzione ha impiegato: 895 millisecondi (Ovviamente le performance dipendono dalla configurazione hardware e software della vostra Workstation). Le successive esecuzioni hanno dato tempi comparabili. Utilizzado lo switch:
java -client Testperformace
L’esecuzione ha impiegato: 760 millisecondi. E gli altri test hanno dato tempi comparabili.
Ma la cosa che mi ha sorpreso più di tutte è questo swith passato alla JVM, un po’ “segreto”:
java -XX:+AggressiveHeap Testperformace
In questo caso il tempo medio per eseguire l’applicazione è stato di soli: 391 millisecondi!!!
Ho poi fatto qualche altro test su pagine JSP ottendo ottimi benefici in termini di velocità. Lo switch in questione però impedisce di fare un corretto profiling della memoria con Netbeans (almeno nella mia Linux Box) e di non sembra funzionare bene in debug. Lo switch -XX:+AggressiveHeap sembra destinato all’uso di applicazioni che devono girare per lunghi periodi senza dovere essere riavviate. Molto Interessante!!!