2011-09-19 13 views
6

Desidero calcolare la quantità di tempo CPU che la mia funzione impiega per eseguire in Java. Attualmente sto facendo come di seguito.Tempo di esecuzione della CPU in Java

long startTime = System.currentTimeMillis(); 
    myfunction(); 
    long endTime = System.currentTimeMillis(); 
    long searchTime = endTime - startTime; 

Ma ho scoperto che per lo stesso I/P ho tempi diversi a seconda del carico del sistema.

Quindi, come ottenere il tempo esatto della CPU richiesto dalla mia funzione.

risposta

6

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.

0

Ci sono una serie di profiler (Jprofile, JProbe, Yourkit) disponibili per analizzare tali dati. E non solo questo, ma molto di più ... (come ad esempio l'utilizzo della memoria, i dettagli della discussione, ecc)

21
  1. System.currentTimeMillis() sarà sempre e solo su misura wall-clock time, mai il tempo di CPU.
  2. Se è necessaria l'ora di orologio a muro, quindi System.nanoTime() è spesso più preciso (e mai peggiore) di currentTimeMillis().
  3. ThreadMXBean.getThreadCPUTime() può aiutarti a scoprire quanta CPU impiega un determinato thread. Utilizza ManagementFactory.getThreadMXBean() per ottenere uno ThreadMXBean e Thread.getId() per trovare lo id della discussione che ti interessa. Nota che questo metodo non deve essere supportato su ogni JVM!
Problemi correlati