Se il collo di bottiglia è abbastanza grande da essere osservato con un profiler, utilizzare un profilatore.
Se è necessaria una maggiore precisione, il modo migliore per misurare un pezzetto di codice è l'utilizzo di un framework di microbenchmark Java come OpenJDK's JMH o Google's Caliper. Credo che siano semplici da usare come JUnit e non solo otterrai risultati più accurati, ma acquisirai l'esperienza della community per farlo nel modo giusto.
Segue un microbenchmark JMH per misurare il tempo di esecuzione di Math.log()
:
private double x = Math.PI;
@Benchmark
public void myBenchmark() {
return Math.log(x)
}
Uso della currentMillis()
e nanoTime()
per misurazione ha molte limitazioni:
- Hanno latenza (hanno anche il tempo di esecuzione) che influenzano le tue misurazioni.
- Hanno MOLTO limitata precisione, questo significa che è possibile mesure cose da 26ns a 26ns in Linux e 300 o giù di lì in Windows ha descritto here
- La fase di riscaldamento non viene preso in considerazione, rendendo le vostre misure fluttuano UN SACCO.
I currentMillis()
e nanoTime()
metodi in Java possono essere utili, ma devono essere utilizzate con ESTREMA CAUTELA oppure è possibile ottenere misure errate errori like this dove l'ordine dei frammenti misurati influenzare le misure o like this dove l'autore erroneamente concludere che diversi milioni di operazioni sono state eseguite in meno di un ms, quando in realtà il JMV non ha realizzato alcuna operazione e ha inserito il codice, senza alcun codice.
Ecco un video meraviglioso che spiega come microbenchmark la strada giusta: https://shipilev.net/#benchmarking
fonte
2015-12-03 15:15:45
si dovrebbe usare 'System.nanoTime()' per misurare il tempo trascorso * * (vedi http://stackoverflow.com/questions/238920/quick-question-java-system-clock/ 239661 # 239661), non 'System.currentTimeMillis()'. Altri punti (warmup, JIT) menzionati da @Stephen in un commento sono ancora validi. –
Utilizzare la classe cronometro per questa attività –