Mentre la JVM si scalda, la quantità di tempo impiegata varierà. La seconda volta che lo eseguirai sarà sempre più veloce del primo. (La prima volta che carica le classi e richiama blocchi statici) Dopo aver eseguito il metodo 10.000 volte, sarà nuovamente più veloce (la soglia predefinita a cui compila il codice nel codice macchina nativo)
Per ottenere una media riproducibile timing per un micro-benchmark, suggerisco di ignorare le prime 10.000 iterazioni e di eseguirlo per 2-10 secondi dopo.
ad es.
long start = 0;
int runs = 10000; // enough to run for 2-10 seconds.
for(int i=-10000;i<runs;i++) {
if(i == 0) start = System.nanoTime();
// do test
}
long time = System.nanoTime() - start;
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs);
Molto importante: eseguire solo uno di questi cicli per metodo. Questo perché ottimizza l'intero metodo in base a come viene utilizzato. Se hai un ciclo occupato come questo, i loop successivi appariranno più lenti perché non sono stati eseguiti e saranno ottimizzati in modo insufficiente.
fonte
2011-09-19 07:23:51
Sì, ma nessuno in realtà risponde alla sua domanda su come misurare il "tempo CPU". –