2010-12-03 7 views
7

Si estoy diseñando una prueba de algoritmo de clasificación ¿puedo hacerlo de esta manera para evitar el calentamiento de JVM? ¡Gracias!Evite el calentamiento de jvm

double count = 0; 
double start, end; 
for(int r = 0; r < warmup; r++) { 
    // do test 
} 
for(int t = 0; t < runs; t++){ 
    start = System.nanoTime(); 
    // do test 
    end = System.nanoTime(); 
    count += start - end; 
} 
double avg = count/avg 
+2

¿Todavía está tratando de comparar un elemento de 5.000 elementos, o ha decidido seguir los consejos dados en su pregunta anterior? Y si ha decidido seguir ese consejo, debe aceptar una de las respuestas. – Anon

+0

Gracias Anon, haré eso – Ang

Respuesta

5

La JVM de calentamiento por lo general se refiere al tiempo que tarda la JVM para encontrar los puntos de acceso y JIT estas secciones del código. Si ejecuta sus pruebas reales unos cientos (en realidad unos pocos miles creo) veces debería ser bastante bueno para ir.

Sin embargo, debe saber que, incluso si lo hace, no hay garantías. Tendrás que experimentar con tu JVM particular para calcular cuánto trabajo tienes que hacer antes de que las partes vitales estén JIT, y así sucesivamente.


En this little case study la compilación JIT patada en 1700 después de las llamadas.

+0

Uhm. pero si el bucle realmente está ejecutando la prueba de clasificación ?! –

+0

Ah, lo siento. No me di cuenta de que realmente ejecutó las pruebas en el ciclo inicial. Sí, eso debería funcionar mejor. Actualizaré mi respuesta. – aioobe

0

Sí. Como el ciclo de calentamiento ejecuta la prueba real, significa que todas las clases, etc., se habrán cargado y las compilaciones JIT deberían haberse ejecutado.

3

Si estoy diseñando una prueba de algoritmo de clasificación, ¿puedo hacerlo de esta manera para evitar el calentamiento de JVM?

Alguna pedantería primero. No debe evitar calentamiento de JVM. Tiene que suceder. Lo que está intentando hacer es evitar que el calentamiento de JVM entre distorsione sus resultados de referencia.

Para responder a su pregunta, el enfoque es más o menos correcto, pero es muy difícil predecir cuántas veces debe realizar la prueba en el ciclo inicial. Es probable que dependa del código de prueba, en la versión de JVM y en el parámetro de ajuste de JVM ... y probablemente también de otras cosas.

Lo que normalmente hago es simplemente imprimir las temporizaciones sin procesar, filtrar las iteraciones iniciales de "calentamiento" que parecen tener valores de temporización anómalos "a simple vista", y luego calcular los promedios a mano. Es torpe, pero me da cierta confianza de que he considerado el calentamiento y otras posibles fuentes de anomalías.

2

Esta es una zona muy grande, pero aquí hay un par de consejos:

1) asegurarse de que su prueba completa (incluyendo el bucle de iteración) se encuentra en una subrutina que se invoca repetidamente. Entonces su prueba tiene el bucle for() en el método "principal". presione hacia abajo a un "niño" e invoque eso repetidamente. Esto permite que las diversas tecnologías JIT hacer realmente una optimización completa sin tener que hacer el reemplazo de código en vuelo (dynamic loop transfer, etc ..)

2) Asegurar la prueba se ejecuta durante mucho tiempo después de un largo calentamiento. 30s es mínimo para el período de medición real, después de un calentamiento igual de largo, si es posible. Por ejemplo, SPECjbb, etc. se ejecuta durante varios minutos por iteración, para múltiples iteraciones.

Cuestiones relacionadas