Medir tiempo de ejecución en java

Oct 12, 2011 13 Comments by

Una forma muy sencilla para medir el tiempo de ejecución en java (y en otros lenguajes) es tomar el tiempo de inicio y final (en la menor escalar posible).

En java, disponemos del método estático System.currentTimeMillis, el cuál nos devuelve un long que representa el tiempo actual en milisegundos, por lo tanto realizando una resta entre el tiempo final y el inicial, podemos obtener aproximadamente el tiempo que demora cierta tarea.

long time_start, time_end;
time_start = System.currentTimeMillis();
ReallyHeavyTask(); // llamamos a la tarea
time_end = System.currentTimeMillis();
System.out.println("the task has taken "+ ( time_end - time_start ) +" milliseconds");

Solo falta decir, que si deseamos convertir milisegundos en segundos, hay que dividir por 1000, pero eso ya es tema básico de conversión de unidades :P .

Java

About the author

Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

13 Responses to “Medir tiempo de ejecución en java”

  1. Carlos Pérez Lara says:

    1 ms != 1000*1s = 1000s
    1ms = 1000/1s = 0,001s

    No se multiplica, se divide por 1000.

    Saludos

  2. deerme.org says:

    A si es, se divide :)

  3. Carlos Pérez Lara says:

    Ah! Otra cosa, a la hora de dividir, como es long, no da un número flotante, recomiendo cambiar ese long a un double.

  4. deerme.org says:

    Efectivamente, sería mejor trabajar con un float si vamos a dividir, Saludos :)

  5. Sebastian Cardoso Castillo de los altos valles del psicotropico says:

    Estoy haciendo un ejercicio en el que me piden implementar un árbol binario y calcular el periodo de mayor retardo en el que un nodo se comunica con los hijos.

    No sabía como medir el tiempo, esto me sirvió mucho, gracias!

    Buenas yerbas! ;)

  6. Alberto says:

    Código súper tonto y súper útil. Son los mejores XDD
    Tengo que procesar una base de datos gigante y hay que controlar todo para que no se desmadre el tiempo.
    Gracias master

  7. Javier de León Barral says:

    Pueden dividir también por 1000.0 y el resultado entonces será “float” al haber al menos uno de los miembros flotante. ;-)

  8. JOSE ANTONIO GAMBOA AGUIRRE says:

    me podrian ayudar :(
    cuando me manda a imprimir a pantalla en la instruccion donde concateno la diferencia de tiempos me arroja un numero demasiado grande que no tiene nada que ver con el tiempo de ejecucion

    long in=System.currentTimeMillis();
    try{

    for(int i =0;i<tam;i++){
    arr[i]=(rm.nextDouble() * rng );

    }
    long f=System.currentTimeMillis();
    long tiempo=f-in;
    System.out.println("se ha llenado el arreglo en "+f" ms\n");
    }
    catch(Exception e){
    System.out.println("Ha ocurrido un error , no se lleno el vector");
    }

  9. Silver91 says:

    Hola una observación, es un milisegundo no un kilosegundo,por lo tanto:

    1 ms= (10^-3) * 1s entonces al multiplicar por 1000:

    (10^-3)*(10^3)*1s=1s

    Si se tratara de convertir un kilosegundo es decir 1000 segundos ahí si divides entre mil para obtener los segundos. Saludos

  10. Humberto says:

    Gracias. La verdad no estoy deacuerdo con eso pues me puso en la tarea y tan solo eran 13 reg en una tabla de 5 campos y tomo 21.755aprox en escribir en pantalla los registros.
    al eliminar la escritura en la pantalla recorrer el ArrayList le tomo 0.0sg aprox al abrir la conexcion a la base de dato leer y mostraren pantalla le tomo 7minutos de los cuales la tarea la tuve que reiniciar 4veces porque se rompia la coneccion jdbc
    tambien descubri que mi jdbc explota al rededor de las 300 intentos de acceso. Bueno fue chevere este experimento.
    Ahora tengo dudas de como poder mantener una conexcion firme por largo tiempo con muchas consultas alavez.
    Alguna ayuda les agradezco

    • deerme.org says:

      Hola Humberto

      Según los “síntomas” jeje que comentas en tu tarea, puedo pensar que tal vez tienes algún problema con el acceso a la base de datos, en el sentido, que es posible, que para cada consulta, estás levantando una nueva conexión y lo más seguro es que tal vez tampoco no tienes un manejo para cerrar las conexiones cuando las dejas de utilizar.

      Te puedo recomendar lo siguiente:

      Utilizar Spring JDBC (o similares), las ventaja, es que son herramientas extremadamente probadas, además, que tienen muchas configuraciones (como por ejemplo, un pool de conexiones). Sin embargo, al parecer como es una tarea académica, es probable que no te dejen utilizar terceras herramientas y te pidan implementar todo de forma clásica con JDBC. Si este es el caso, implementa un diseño para el acceso a tu DB, ejemplo un patrón de factory o singleton te pueden servir, te dejo un par de enlaces que implementan estos diseños con jdbc que creo que te pueden ayudar http://theopentutorials.com/tutorials/java/jdbc/jdbc-examples-introduction/ http://www.technowlogeek.com/programming/java/jdbc/factory-design-pattern-implementation-inside-dao-example/

      Saludos!

  11. Isabel says:

    Hola una duda como funciona esta parte:

    ReallyHeavyTask(); // llamamos a la tarea

    se que dice que se llama a la tarea pero no logro comprender que se supone que hace

Leave a Reply


two * 7 =