Pregunta

Primero que todo, debo admitir que estas son preguntas muy básicas y primitivas ... Quiero demostrar diferentes algoritmos en Java para clasificar y buscar, y obtener un valor para el tiempo de ejecución. Hay problemas que no puedo resolver:

  1. hay una compilación de Hotspot, que es una optimización de tiempo de ejecución que necesito desactivar (supongo).

  2. ¿Cómo obtengo los valores de tiempo (segundos) para los tiempos de ejecución? Iniciar un temporizador antes de la ejecución y detenerlo después ... parece un poco primitivo. Y el objeto temporizador mismo consume tiempo de ejecución ... Necesito evitar eso.

¿Hay algo en la API de Java que se pueda utilizar para resolver estos problemas?

Gracias, Klaus

¿Fue útil?

Solución

  1. Utilice el indicador JVM -Xint . Se pueden ver otras opciones aquí .

  2. Use ThhreadMXBean API para obtener tiempos de CPU / usuario para tu hilo. Puede ver un ejemplo aquí .

Otros consejos

Puede deshabilitar HotSpot con -Xint en la línea de comandos, para obtener un decremento de magnitud en el rendimiento. Sin embargo, ¿por qué no quieres medir el rendimiento del mundo real? Diferentes cosas pueden convertirse en cuellos de botella cuando compilas.

Generalmente para microbenchmarks:

  • use System.nanoTime para obtener una medición de tiempo al inicio y al final
  • ejecutar durante un período de tiempo razonable
  • realizar la medición varias veces (hay algunos " calentamiento ")
  • no intercale medidas de diferentes algoritmos
  • no haga ninguna E / S en el segmento medido
  • utilice el resultado (HotSpot puede optimizar completamente las operaciones triviales)
  • hazlo en una situación del mundo real (o una cloae como sea posible)
  • recordar que el doble núcleo es la norma, y ??más núcleos se volverán normales

El uso de System.nanoTime () consume dos veces menos de 1 microsegundo. Le sugiero que ejecute cualquier punto de referencia durante unos segundos y tome un promedio para que un error de microsegundos no sea significativo.

En general, sugeriría que no compliques las cosas más de lo que necesitas.

Para tener un calentamiento incorporado, a menudo ignoro el primer 10% -20% de las iteraciones. Algo como

long start;
int count;
for(int i = -count / 5; i < count; i++) {
    if (count == 0) start = System.nanoTime();
    // do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top