Medición del tiempo de ejecución de Java, uso de memoria y carga de CPU para un segmento de código


Para un segmento particular de código Java, me gustaría medir:

  • Tiempo de ejecución (lo más probable tiempo de ejecución del hilo)
  • Uso de memoria
  • Carga de CPU (atribuible específicamente al segmento de código)

Soy un principiante relativo de Java y no estoy familiarizado con cómo se podría lograr esto. Me han referido a JMX , sin embargo, no estoy seguro de cómo podría usarse, y JMX parece un poco 'pesado' para lo que estoy buscando hacer.

Lo ideal sería que me gustaría alguna clase de medida que se puede decir lo que me gustaría medir, con la opción de llamar a un método start() antes de un segmento de código y un método stop() después. Las métricas relevantes se registrarían en un archivo que especifique.

Por ejemplo:

import com.example.metricLogger;

metricLogger logger = new metricLogger();

logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);

logger.start();

/* Code to be measured */

logger.stop();

¿Hay alguna forma estándar / común / convencional de lograr esto en Java?

Tales mediciones son para comparaciones de rendimiento únicas, por lo que no estoy buscando ninguna procesos de monitoreo a largo plazo en producción.

Estoy más que feliz de ser referido a tutoriales o ejemplos externos y no espero una respuesta completa aquí. Dicho esto, si algo tan simple como lo anterior se puede lograr un ejemplo realista iría muy bien.

Author: Peter Mortensen, 2008-11-19

3 answers

La creación de perfiles puede ser una opción más fácil, ya que no requiere estadísticas en producción. La creación de perfiles tampoco requiere modificación de código. VisualVM (que se envía con el JDK 1.6.06+) es una herramienta simple. Si quieres algo más profundo iría con Eclipse TPTP, Netbeans profiler, o JProfiler (pago).

Si quieres escribir tu propio, considera lo siguiente:

Mediciones simples como el tiempo de ejecución se pueden hacer "cronometrando"la sección que le interesa:

long start = System.nanoTime(); // requires java 1.5
// Segment to monitor
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9;

Puedes utilice una técnica similar para monitorear la memoria a través del tiempo de ejecución.getRuntime().* métodos memory (). Tenga en cuenta que el seguimiento del uso de la memoria en un entorno recopilado de basura es más complicado que la simple resta.

La carga de la CPU es difícil de medir en Java, normalmente me quedo con el tiempo de ejecución y optimizo las secciones más largas / repetitivas

 19
Author: basszero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-16 09:47:47

Con ThreadMXBean puede obtener el uso de CPU de subprocesos individuales y el tiempo de cpu consumido en lugar de tiempo transcurrido que puede ser útil.

Sin embargo, a menudo es más fácil usar un generador de perfiles, ya que este proceso a menudo genera una gran cantidad de datos y necesita una buena herramienta de visualización para ver lo que está sucediendo.

Uso Yourkit ya que me resulta más fácil resolver problemas que otros perfiladores que he usado. También uso el hprof incorporado, ya que esto puede darle una vista diferente en el perfil de su aplicación (pero no tan útil)

 5
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-24 07:40:04

Usar un Java Profiler es la mejor opción y te dará toda la información que necesitas sobre el código. viz Tiempos de Respuesta, Pistas de Llamada de Hilo, Utilizaciones de Memoria, etc

Te sugeriré JENSOR, un generador de perfiles Java de código abierto, por su facilidad de uso y bajos gastos generales en la CPU. Puede descargarlo, instrumentar el código y obtendrá toda la información que necesita sobre su código.

Puedes descargarlo desde: http://jensor.sourceforge.net/

 1
Author: M.N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-28 07:16:15