¿Cómo cronometro la ejecución de un método en Java?

8 minutos de lectura

¿Como cronometro la ejecucion de un metodo en Java
Ogro Salmo33

  1. ¿Cómo obtengo el tiempo de ejecución de un método?
  2. Hay un Timer ¿clase de utilidad para cosas como cronometrar cuánto tiempo lleva una tarea, etc.?

La mayoría de las búsquedas en Google arrojan resultados de temporizadores que programan hilos y tareas, que no es lo que quiero.

  • JAMon API es una API de Java gratuita, simple, de alto rendimiento y segura para subprocesos que permite a los desarrolladores monitorear fácilmente el rendimiento y la escalabilidad de las aplicaciones de producción. JAMon rastrea hits, tiempos de ejecución (total, avg, min, max, std dev) y más. http://jamonapi.sourceforge.net/ descargar : http://sourceforge.net/project/showfiles.php?group_id=96550

    –Mike Pone

    7 oct 2008 a las 21:47

  • También es posible que desee ver el Cronómetro Apache Commons Lang clase. Una clase de utilidad simple pero útil.

    usuario101561

    5 de mayo de 2009 a las 13:10


  • Pregunta similar posterior: ¿Cómo escribo un micro-benchmark correcto en Java?

    – Basil Bourque

    1 de julio de 2016 a las 22:48

  • Sí, StopWatch es ideal para esto.

    – Shubham Pandey

    1 de agosto de 2019 a las 6:08

  • Java 8 utilizando Instant clase: stackoverflow.com/a/30975902/1216775

    – akhil_mittal

    1 de agosto de 2019 a las 11:36

Voy con la respuesta simple. Funciona para mi.

long startTime = System.currentTimeMillis();

doReallyLongThing();

long endTime = System.currentTimeMillis();

System.out.println("That took " + (endTime - startTime) + " milliseconds");

Funciona bastante bien. La resolución es obviamente solo al milisegundo, puede hacerlo mejor con System.nanoTime(). Existen algunas limitaciones para ambos (porciones de programación del sistema operativo, etc.) pero esto funciona bastante bien.

Haga un promedio de un par de ejecuciones (cuanto más, mejor) y obtendrá una idea decente.

  • En realidad, System.currentTimeMillis() solo tiene una precisión superior a 15 ms. Para valores realmente bajos no se puede confiar. La solución para esto (como se mencionó) es System.nanoTime();

    – Steve g

    7 oct 2008 a las 21:38

  • Ok, estaba a punto de aceptar esto como la respuesta oficial hasta que leí el comentario de Steve g. ¡Gran dato, Steve!

    – Ogro Salmo33

    8 de octubre de 2008 a las 12:15

  • nanoTime() no garantiza una precisión mejor que currentTimeMillis, pero muchas implementaciones de JVM tienen una mejor precisión con nanoTime.

    – James Scheck

    8 de octubre de 2008 a las 17:22

  • @JamesSchek Realmente necesita ver su redacción, como ya mencioné en este comentario idéntico en otro lugar; nanoTime está garantizado para ser al menos tan decidido como currentTimeMillis. docs.oracle.com/javase/7/docs/api/java/lang/…

    – b1nary.atr0phy

    18 mayo 2013 a las 15:37


  • La pequeña ventaja de currentTimeMillis es que es una marca de tiempo real, y también podría usarse para registrar las horas de inicio/finalización, mientras que nanoTime “solo se puede usar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción de sistema o tiempo de reloj de pared”.

    – Brad parques

    28 de noviembre de 2016 a las 14:17

  • Desafortunadamente, el cronómetro de guayaba no es seguro para subprocesos. Aprendí esto de la manera difícil.

    – Dexter Legazpi

    15 de diciembre de 2014 a las 14:50

  • @DexterLegaspi ¡Estaría muy interesado en tu experiencia! ¿Te importa compartir?

    – Siddhartha

    19/01/2015 a las 19:30

  • Usar el cronómetro en paralelo lo llevaría a llamar start() varias veces seguidas (lo mismo para stop()).

    – Samuel Mingwei

    16 de agosto de 2019 a las 17:36

¿Como cronometro la ejecucion de un metodo en Java
Sufiyán Ghori

Utilizando Instante y Duración de la nueva API de Java 8,

Instant start = Instant.now();
Thread.sleep(5000);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

salidas,

PT5S

  • Gracias, ¿Cómo puedo mostrar el resultado sin tener el PT al frente?

    – java123999

    16/03/2016 a las 15:31

  • El problema con el método es que Instant no tiene problemas de precisión de milisegundos y nanosegundos. Ref: stackoverflow.com/questions/20689055/…

    – prashantsunkari

    12 abr 2017 a las 22:56

  • @java123999: Puedes llamar Duration.between(start, end).getSeconds(). Duration también tiene métodos para convertir a otras unidades de tiempo, por ejemplo toMillis() que se convierte a milisegundos.

    –Emil Lunde

    29 de mayo de 2018 a las 13:29


Reunió todas las formas posibles en un solo lugar.

Fecha

Date startDate = Calendar.getInstance().getTime();
long d_StartTime = new Date().getTime();
Thread.sleep(1000 * 4);
Date endDate = Calendar.getInstance().getTime();
long d_endTime = new Date().getTime();
System.out.format("StartDate : %s, EndDate : %s \n", startDate, endDate);
System.out.format("Milli = %s, ( D_Start : %s, D_End : %s ) \n", (d_endTime - d_StartTime),d_StartTime, d_endTime);

Sistema.horaActualMillis()

long startTime = System.currentTimeMillis();
Thread.sleep(1000 * 4);
long endTime = System.currentTimeMillis();
long duration = (endTime - startTime);  
System.out.format("Milli = %s, ( S_Start : %s, S_End : %s ) \n", duration, startTime, endTime );
System.out.println("Human-Readable format : "+millisToShortDHMS( duration ) );

Legible por humanos Formato

public static String millisToShortDHMS(long duration) {
    String res = "";    // java.util.concurrent.TimeUnit;
    long days       = TimeUnit.MILLISECONDS.toDays(duration);
    long hours      = TimeUnit.MILLISECONDS.toHours(duration) -
                      TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes    = TimeUnit.MILLISECONDS.toMinutes(duration) -
                      TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds    = TimeUnit.MILLISECONDS.toSeconds(duration) -
                      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    long millis     = TimeUnit.MILLISECONDS.toMillis(duration) - 
                      TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration));

    if (days == 0)      res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis);
    else                res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis);
    return res;
}

Guayaba: Google CronógrafoFRASCO « Un objeto de Stopwatch es medir el tiempo transcurrido en nanosegundos.

com.google.common.base.Stopwatch g_SW = Stopwatch.createUnstarted();
g_SW.start();
Thread.sleep(1000 * 4);
g_SW.stop();
System.out.println("Google StopWatch  : "+g_SW);

Apache Commons LangFRASCO

« Cronógrafo proporciona una API conveniente para los tiempos.

org.apache.commons.lang3.time.StopWatch sw = new StopWatch();
sw.start();     
Thread.sleep(1000 * 4);     
sw.stop();
System.out.println("Apache StopWatch  : "+ millisToShortDHMS(sw.getTime()) );

JODA-HORA

public static void jodaTime() throws InterruptedException, ParseException{
    java.text.SimpleDateFormat ms_SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
    String start = ms_SDF.format( new Date() ); // java.util.Date

    Thread.sleep(10000);

    String end = ms_SDF.format( new Date() );       
    System.out.println("Start:"+start+"\t Stop:"+end);

    Date date_1 = ms_SDF.parse(start);
    Date date_2 = ms_SDF.parse(end);        
    Interval interval = new org.joda.time.Interval( date_1.getTime(), date_2.getTime() );
    Period period = interval.toPeriod(); //org.joda.time.Period

    System.out.format("%dY/%dM/%dD, %02d:%02d:%02d.%04d \n", 
        period.getYears(), period.getMonths(), period.getDays(),
        period.getHours(), period.getMinutes(), period.getSeconds(), period.getMillis());
}

API de fecha y hora de Java de Java 8 ” A Duración objeto representa un período de tiempo entre dos Instante objetos.

Instant start = java.time.Instant.now();
    Thread.sleep(1000);
Instant end = java.time.Instant.now();
Duration between = java.time.Duration.between(start, end);
System.out.println( between ); // PT1.001S
System.out.format("%dD, %02d:%02d:%02d.%04d \n", between.toDays(),
        between.toHours(), between.toMinutes(), between.getSeconds(), between.toMillis()); // 0D, 00:00:01.1001 

marco de primavera proporciona Cronógrafo clase de utilidad para medir el tiempo transcurrido en Java.

StopWatch sw = new org.springframework.util.StopWatch();
sw.start("Method-1"); // Start a named task
    Thread.sleep(500);
sw.stop();

sw.start("Method-2");
    Thread.sleep(300);
sw.stop();

sw.start("Method-3");
    Thread.sleep(200);
sw.stop();

System.out.println("Total time in milliseconds for all tasks :\n"+sw.getTotalTimeMillis());
System.out.println("Table describing all tasks performed :\n"+sw.prettyPrint());

System.out.format("Time taken by the last task : [%s]:[%d]", 
        sw.getLastTaskName(),sw.getLastTaskTimeMillis());

System.out.println("\n Array of the data for tasks performed « Task Name: Time Taken");
TaskInfo[] listofTasks = sw.getTaskInfo();
for (TaskInfo task : listofTasks) {
    System.out.format("[%s]:[%d]\n", 
            task.getTaskName(), task.getTimeMillis());
}

Producción:

Total time in milliseconds for all tasks :
999
Table describing all tasks performed :
StopWatch '': running time (millis) = 999
-----------------------------------------
ms     %     Task name
-----------------------------------------
00500  050%  Method-1
00299  030%  Method-2
00200  020%  Method-3

Time taken by the last task : [Method-3]:[200]
 Array of the data for tasks performed « Task Name: Time Taken
[Method-1]:[500]
[Method-2]:[299]
[Method-3]:[200]

  • Gracias, ¿Cómo puedo mostrar el resultado sin tener el PT al frente?

    – java123999

    16/03/2016 a las 15:31

  • El problema con el método es que Instant no tiene problemas de precisión de milisegundos y nanosegundos. Ref: stackoverflow.com/questions/20689055/…

    – prashantsunkari

    12 abr 2017 a las 22:56

  • @java123999: Puedes llamar Duration.between(start, end).getSeconds(). Duration también tiene métodos para convertir a otras unidades de tiempo, por ejemplo toMillis() que se convierte a milisegundos.

    –Emil Lunde

    29 de mayo de 2018 a las 13:29


Use un generador de perfiles (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, etc.). Obtendrá los resultados más precisos y es el menos intrusivo. Usan el mecanismo JVM incorporado para la creación de perfiles, que también puede brindarle 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 completamente integrado, es muy trivial perfilar un método. Haga clic con el botón derecho, Perfilador -> Agregar a métodos raíz. Luego ejecute el generador de perfiles como si estuviera haciendo una prueba o un depurador.

  • Esta también fue una gran sugerencia, y uno de esos momentos “obvio” para mí cuando leí esta respuesta. Nuestro proyecto usa JDeveloper, pero lo verifiqué y, efectivamente, ¡tiene un generador de perfiles incorporado!

    – Ogro Salmo33

    8 de octubre de 2008 a las 12:14

  • Desde java 7 build 40 (creo) incluyeron el antiguo JRockits Flight Recorder a java (busque Java Mission Control)

    – Niels Bech Nielsen

    17/03/2014 a las 13:30

  • ¡Efectivamente @NielsBechNielsen! oracle.com/technetwork/java/javaseproducts/mission-control/…

    – Ogro Salmo33

    7 julio 2014 a las 14:43

  • ¿Cómo obtener la ejecución del método en Java por Visual VM, por ejemplo?

    – petertc

    13 de noviembre de 2014 a las 8:06

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad