2011-09-19 22 views
6

Quiero calcular cuánto tiempo de CPU requiere mi función para ejecutarse en Java. Actualmente estoy haciendo lo siguiente.Tiempo de ejecución de CPU en Java

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

Pero descubrí que por la misma I/P obtengo un tiempo diferente dependiendo de la carga del sistema.

Entonces, cómo obtener el tiempo exacto de la CPU que mi función tardó en ejecutarse.

Respuesta

6

A medida que la JVM se calienta, la cantidad de tiempo empleado puede variar. La segunda vez que ejecutas esto siempre será más rápido que el primero. (La primera vez que tiene que cargar clases y llamar a bloques estáticos) Después de haber ejecutado el método 10.000 veces será más rápido otra vez (El umbral predeterminado en el que compila el código en código de máquina nativo)

Para obtener un promedio reproducible el tiempo para un micro-punto de referencia, le sugiero que ignore las primeras 10.000 iteraciones y lo ejecute durante 2-10 segundos después de eso.

p. Ej.

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); 

Muy importante: solo realice uno de estos ciclos por método. Esto se debe a que optimiza todo el método en función de cómo se usa. Si tiene un bucle ocupado como este, los bucles posteriores aparecerán más lentos porque no se han ejecutado y se optimizarán mal.

0

Hay una serie de perfiladores (Jprofile, JProbe, YourKit) disponibles para analizar tales datos Y no sólo esto, sino mucho más ... (como la utilización de memoria, detalles de hilo, etc.)

21
  1. System.currentTimeMillis() referida solamente medir wall-clock time, nunca el tiempo de CPU.
  2. Si necesita tiempo de reloj de pared, entonces System.nanoTime() suele ser más preciso (y nunca peor) que currentTimeMillis().
  3. ThreadMXBean.getThreadCPUTime() puede ayudarlo a averiguar cuánto tiempo de CPU ha usado un hilo dado. Use ManagementFactory.getThreadMXBean() para obtener un ThreadMXBean y Thread.getId() para encontrar el id del tema que le interesa. ¡Tenga en cuenta que este método no necesita ser admitido en todas las JVM!
Cuestiones relacionadas