- ¿Cómo obtengo el tiempo de ejecución de un método?
- ¿Hay una
Timer
clase de utilidad para cosas como el tiempo que dura una tarea, etc.?
La mayoría de las búsquedas en Google devuelven resultados de temporizadores que programan hilos y tareas, que no es lo que quiero.
java
timing
execution-time
Salmo de ogro33
fuente
fuente
Instant
clase: stackoverflow.com/a/30975902/1216775Respuestas:
Siempre hay una forma anticuada:
fuente
Voy con la respuesta simple. Funciona para mi.
Funciona bastante bien La resolución obviamente es solo de milisegundos, puede mejorar con System.nanoTime (). Existen algunas limitaciones para ambos (segmentos de programación del sistema operativo, etc.) pero esto funciona bastante bien.
Promedio en un par de carreras (cuanto más, mejor) y obtendrá una idea decente.
fuente
nanoTime
se garantiza que sea al menos tan resuelto comocurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
es que es una marca de tiempo real, y también podría usarse para registrar las horas de inicio / finalización, mientras quenanoTime
"solo se puede usar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción de tiempo de sistema o reloj de pared". ".¡Vamos chicos! Nadie mencionó la forma en que Guava hace eso (lo cual es posiblemente increíble):
Lo bueno es que Stopwatch.toString () hace un buen trabajo al seleccionar unidades de tiempo para la medición. Es decir, si el valor es pequeño, generará 38 ns, si es largo, mostrará 5m 3s
Aún mejor:
Nota: Google Guava requiere Java 1.6+
fuente
start()
varias veces seguidas (lo mismo parastop()
).Usando Instant y Duration de la nueva API de Java 8,
salidas,
fuente
Duration.between(start, end).getSeconds()
.Duration
también tiene métodos para convertir a otras unidades de tiempo, por ejemplo,toMillis()
que convierte a milisegundos.Reunió todas las formas posibles juntas en un solo lugar.
Fecha
Sistema. currentTimeMillis ()
Formato legible para humanos
Guayaba: Google Stopwatch JAR «Un objeto de Stopwatch es medir el tiempo transcurrido en nanosegundos.
Apache Commons Lang JAR « StopWatch proporciona una API conveniente para los tiempos.
JODA TIEMPO
API de fecha y hora de Java de Java 8 «Un objeto de duración representa un período de tiempo entre dos objetos instantáneos .
Spring Framework proporcionala clase de utilidad StopWatch para medir el tiempo transcurrido en Java.
Salida:
fuente
Utilice un generador de perfiles (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, etc.). Obtendrá los resultados más precisos y es el menos intrusivo. Utilizan el mecanismo JVM incorporado para la creación de perfiles, que también puede proporcionarle información adicional como seguimientos de pila, rutas de ejecución y resultados más completos si es necesario.
Cuando se utiliza un generador de perfiles totalmente integrado, es muy trivial perfilar un método. Haga clic derecho, Profiler -> Agregar a métodos de raíz. Luego ejecute el generador de perfiles como si estuviera haciendo una ejecución de prueba o depurador.
fuente
Probablemente esto no sea lo que querías que dijera, pero este es un buen uso de AOP. Agite un interceptor proxy alrededor de su método y realice el cronometraje allí.
Lamentablemente, el qué, el por qué y el cómo de AOP está más allá del alcance de esta respuesta, pero así es como probablemente lo haría.
Editar: aquí hay un enlace a Spring AOP para comenzar, si está interesado. Esta es la implementación más accesible de AOP que he encontrado para Java.
Además, dadas las sugerencias muy simples de todos los demás, debo agregar que AOP es para cuando no quieres que cosas como el tiempo invadan tu código. Pero en muchos casos, ese tipo de enfoque simple y fácil está bien.
fuente
System.currentTimeMillis();
NO ES un buen enfoque para medir el rendimiento de sus algoritmos. Mide el tiempo total que experimenta como usuario mirando la pantalla de la computadora. También incluye el tiempo consumido por todo lo demás que se ejecuta en segundo plano en su computadora. Esto podría marcar una gran diferencia en caso de que tenga muchos programas ejecutándose en su estación de trabajo.Enfoque adecuado está utilizando
java.lang.management
paquete.Del sitio web http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking :
getCpuTime()
El método te da la suma de esos:fuente
Con Java 8 también puede hacer algo como esto con todos los métodos normales :
con TimeIt like:
Con este método, puede realizar mediciones de tiempo fáciles en cualquier parte de su código sin romperlo. En este sencillo ejemplo, solo imprimo la hora. Puede agregar un Switch para TimeIt, por ejemplo, para imprimir solo la hora en DebugMode o algo así.
Si está trabajando con Function , puede hacer algo como esto:
fuente
También podemos usar la clase StopWatch de comunes de Apache para medir el tiempo.
Código de muestra
fuente
Solo un pequeño giro, si no usa herramientas y desea cronometrar métodos con un tiempo de ejecución bajo: ejecútelo muchas veces, duplicando cada vez el número de veces que se ejecuta hasta llegar a un segundo, más o menos. Por lo tanto, el tiempo de la Llamada a System.nanoTime y demás, ni la precisión de System.nanoTime afectan mucho el resultado.
Por supuesto, se aplican las advertencias sobre el uso del reloj de pared: influencias de la compilación JIT, múltiples subprocesos / procesos, etc. Por lo tanto, primero debe ejecutar el método muchas veces primero, de modo que el compilador JIT haga su trabajo, y luego repita esta prueba varias veces y tome el tiempo de ejecución más bajo.
fuente
Estamos utilizando las anotaciones de AspectJ y Java para este propósito. Si necesitamos saber el tiempo de ejecución de un método, simplemente lo anotamos. Una versión más avanzada podría usar un nivel de registro propio que se puede habilitar y deshabilitar en tiempo de ejecución.
fuente
JEP 230: Suite Microbenchmark
FYI, JEP 230: Microbenchmark Suite es un proyecto OpenJDK para:
Esta característica llegó a Java 12 .
Arnés de microbenchmark de Java (JMH)
Para versiones anteriores de Java, eche un vistazo al proyecto de Java Microbenchmark Harness (JMH) en el que se basa JEP 230.
fuente
Muy buen código.
http://www.rgagnon.com/javadetails/java-0585.html
fuente
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Puedes usar Perf4j . Muy buena utilidad. El uso es simple
Se puede encontrar más información en la Guía del desarrolladorEditar: Proyecto parece muerto
fuente
fuente
Básicamente, hago variaciones de esto, pero teniendo en cuenta cómo funciona la compilación de puntos de acceso, si desea obtener resultados precisos, debe descartar las primeras mediciones y asegurarse de que está utilizando el método en una aplicación del mundo real (leer la aplicación específica).
Si el JIT decide compilarlo, sus números variarán mucho. así que solo ten en cuenta
fuente
Usando AOP / AspectJ y
@Loggable
anotaciones de jcabi-Aspect puede hacerlo de manera fácil y compacta:Cada llamada a este método se enviará a la instalación de registro SLF4J con
DEBUG
nivel de registro. Y cada mensaje de registro incluirá el tiempo de ejecución.fuente
Spring proporciona una clase de utilidad org.springframework.util.StopWatch , según JavaDoc:
Uso:
Salida:
Con aspectos:
fuente
He escrito un método para imprimir el tiempo de ejecución del método en una forma muy legible. Por ejemplo, para calcular el factorial de 1 millón, se tarda aproximadamente 9 minutos. Entonces el tiempo de ejecución se imprime como:
El código está aquí:
fuente
Hay un par de formas de hacerlo. Normalmente vuelvo a usar algo como esto:
o lo mismo con System.nanoTime ();
Para algo más en el lado de la evaluación comparativa de las cosas también parece ser este: http://jetm.void.fm/ Sin embargo, nunca lo intenté.
fuente
Puede usar la biblioteca de métricas que proporciona varios instrumentos de medición. Añadir dependencia:
Y configúrelo para su entorno.
Los métodos se pueden anotar con @Timed :
o pieza de código envuelta con Timer :
Las métricas agregadas se pueden exportar a la consola, JMX, CSV u otras.
@Timed
ejemplo de salida de métricas:fuente
Si quieres tiempo de reloj de pared
fuente
Como dijo "skaffman", use AOP O puede usar el tejido de código de bytes de tiempo de ejecución, al igual que las herramientas de cobertura de métodos de prueba de unidad usan para agregar de manera transparente información de temporización a los métodos invocados.
Puede consultar el código utilizado por las herramientas de herramientas de código abierto como Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). La otra herramienta de cobertura de código abierto es http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Si finalmente logra hacer lo que se propuso, por favor. compártelo de nuevo con la comunidad aquí con su tarea / jarras de hormigas.
fuente
fuente
Modifiqué el código de la respuesta correcta para obtener el resultado en segundos:
fuente
Puede usar la clase de cronómetro del proyecto principal de primavera:
Código:
Documentación para el cronómetro: cronómetro simple, que permite la sincronización de una serie de tareas, exponiendo el tiempo total de ejecución y el tiempo de ejecución para cada tarea nombrada. Oculta el uso de System.currentTimeMillis (), lo que mejora la legibilidad del código de la aplicación y reduce la probabilidad de errores de cálculo. Tenga en cuenta que este objeto no está diseñado para ser seguro para subprocesos y no utiliza sincronización. Esta clase se usa normalmente para verificar el rendimiento durante la prueba de conceptos y en el desarrollo, en lugar de como parte de las aplicaciones de producción.
fuente
Puedes intentarlo de esta manera si solo quieres saber la hora.
fuente
Ok, esta es una clase simple que se utilizará para una sincronización simple y simple de sus funciones. Hay un ejemplo debajo de él.
Muestra de uso:
Muestra de salida de consola:
fuente
En Java 8
Instant
se introduce una nueva clase llamada . Según el documento:Esto se puede usar como:
Se imprime
PT7.001S
.fuente