2013-03-08 19 views
6

Per scrivere un buon test di confronto è necessario eseguirlo diverse migliaia (milioni) di volte. Livellerà (nella maggior parte dei casi) l'influenza degli altri programmi.Come eseguire un buon test di confronto delle prestazioni?

Ma se una JVM può influenzare i risultati. Per esempio:

prima soluzione è:

final StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(getStrOne()); 
    stringBuilder.append(getStrTwo()); 
    final String result1 = stringBuilder.toString(); 

E in secondo luogo è:

final String result2 = getStrOne() + getStrTwo(); 

non so che uno è migliore perché JVM può influenzare i risultati. Come sapere qual è il migliore?

UPDATE: Non voglio dire esattamente che aggiungendo prova comporation. Sto chiedendo di una situazione così difficile da testare.

+2

Che cosa intendi con JVM può influenzare i risultati? – ddmps

+1

Il secondo verrà convertito in 'final String result2 =" str1str2 ";' dal compilatore ... – assylias

+0

@Pescis Ad esempio il caching. –

risposta

2

Recentemente ho eseguito alcuni test di benchmark che si basavano sull'eccellente articolo IBM trovato qui: http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html.

L'articolo descrive molte delle insidie ​​che possono influenzare la precisione dei risultati, ad esempio: l'ottimizzazione

  • Runtime/ri-compilazione del codice.
  • Morto eliminazione di codice (cioè risultati non utilizzati possono causare il codice di prova di essere rimosso)
  • Garbage Collection
  • Caching
  • ...

Infine, i link articolo ad un sito in cui un il quadro può essere downloaded. Il framework fa un ottimo lavoro nello spooling di un metodo di test, cercando prove di ricompilazione e aspettando che il tempo di esecuzione si stabilizzi.

0

In caso di 2 stringhe, differenze di prestazioni sono trascurabili, ma provare quanto segue:

String s = ""; 
for(int i = 0; i < 10000; i++) { 
    s += i; 
} 

vs.

StringBuilder b = new StringBuilder(); 
for(int i = 0; i < 10000; i++) { 
    b.append(i); 
} 

Troverete che il secondo ciclo è il modo più veloce. Perché? Perché la concatenazione di stringhe creerà un nuovo oggetto String in ogni iterazione, che spreca i cicli della CPU e la memoria.

ti cito voi:

Per scrivere un buon test di prova comparations bisogna testarlo diverse migliaia (milioni) volte. Livellerà (nella maggior parte dei casi) l'influenza degli altri programmi.

Lo stesso vale per i test in un unico VM: provare il codice più volte, utilizzare dati più grandi, più grandi anse ecc Confrontando solo piccole porzioni non ha senso a causa di errori di temporizzazione di precisione e altre influenze (es raccolta dei rifiuti in esecuzione tra).

Problemi correlati