2011-06-05 22 views
6

¿Hay alguna manera de saber cuántos segundos tarda un ciclo en ejecutarse en Java?¿Cuánto tiempo lleva ejecutar un ciclo?

Por ejemplo:

for(int i=0; i < 1000000; i++) { 

//Do some difficult task goes in here 

} 

No tiene que ser exacta al 100%, pero es sólo para tener una idea de cuánto tiempo podría tomar. El algoritmo interno es un tipo de generador de claves que escribe en un archivo .txt. Espero que tarde unos minutos, por lo que para mi primera prueba quiero contar los segundos.

+0

Esto dependerá completamente del tipo de máquina utilizada. Deberá compararlo. –

+0

Añadir código a la evaluación comparativa agregará pasos adicionales a su ciclo, haciendo que su punto de referencia sea inexacto por diseño. –

Respuesta

8

Aquí puede probar esto:

long startTime = System.currentTimeMillis(); 
long endTime = 0; 

    for(int i=0; i < 1000000; i++) { 

    //Something 

    } 

endTime = System.currentTimeMillis(); 

long timeneeded = ((startTime - endTime) /1000); 
+1

@Michael Parker: Pruebe 'System.nanoTime();' –

+0

Tenga en cuenta que este enfoque simplista puede dar respuestas engañosas. –

+1

¿Por qué estás asignando 0 a 'endTime'? –

1

Esto depende de la operación dentro del bucle, por lo que lo que debe hacer es registrar el tiempo de inicio del bucle y la hora de finalización del bucle y luego calcular la diferencia. Obtendrás el tiempo que tarda el loop en terminar. Ejemplo: -

long st = System.currentTimeMillis(); 

for(int i=0; i < 1000000; i++) { 
    // --- loop operation 
} 

System.out.print("time to execute loop"+ 
        ((st - System.currentTimeMillis()) /1000)); 
+0

Tenga en cuenta que este enfoque simplista puede dar respuestas engañosas. –

+0

A menos que el tiempo vaya hacia atrás (lo que puede suceder cuando ajusta el reloj) sus tiempos serán todos negativos. –

11

Es necesario tener mucho cuidado al escribir micro-puntos de referencia en Java. Por ejemplo:

  • Si el compilador JIT puede darse cuenta de que el cuerpo del ciclo no afecta a los resultados del código, se puede optimizar la basura. Por ejemplo:

    for (int i = 0; i < 1000000; i++) { 
        int j = i + 1; 
    } 
    

    es probable que "se ejecute" muy rápido.

  • El código se ejecuta mucho más rápido después de que se ha compilado JIT.

  • código puede aparecer que correr mucho más lenta mientras se compila siendo JIT.

  • Si el código asigna objetos, debe tener en cuenta la variabilidad potencial del rendimiento medido debido a la ejecución del GC, el tamaño de almacenamiento dinámico inicial o máximo demasiado pequeño, y así sucesivamente.

Y, por supuesto, el rendimiento dependerá de su hardware, el sistema operativo, la versión y el parche nivel de la JVM, y sus opciones de lanzamiento de JVM.

+2

+1: Cuando tienes un ciclo largo con no hace nada, en realidad estás midiendo el tiempo que lleva determinar que el ciclo no hace nada. ;) –

2

Una forma de cronometrar una operación es tomar un promedio con nanoTime() Es posible que desee ajustar el número de iteraciones y obtendrá una menor variación con un promedio. nanoTime es mejor que currentTimeMillis en que es más preciso y aumentando de forma monótona (no va a ir hacia atrás mientras se ejecuta la aplicación)

long start = System.nanoTime(); 
int runs = 1000*1000; 
for(int i=0;i<runs;i++) { 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("The average time taken was %.1f ns%n", (double) time/runs); 

El uso de printf le permite formatear el resultado. Puede dividir por 1000 para obtener micro segundos o 1000000 por microsegundos.

Cuestiones relacionadas