Medir el tiempo de ejecución en Java




Muchas veces es útil medir el tiempo de ejecución que tienen nuestros algoritmos, en algunas ocasiones me he encontrado con que un problema puede tener 2 soluciones o más, pero ¿cual de estas es más optima o eficiente? eso lo podríamos saber observando cual de estos algoritmos se ejecuta más rápido. El tiempo de ejecución puede ser mayor o menor dependiendo de la cantidad de operaciones e instrucciones que se ejecuten. 

¿Como medir este tiempo?

Este tiempo lo podemos obtener mediante la diferencia entre la hora del sistema en que finalizo el algoritmo y la hora del sistema que inicio. Sí por ejemplo empezaste a leer esta entrada a las 20:03:11 y la terminaste de leer a las 20:04:52 entonces la diferencia daría como resultado 00:1:41 es decir, tardaste en leer esta entrada 1 minuto y 41 segundos. 

¿Como hacerlo en Java?


Inicialmente necesitamos un método para obtener la hora o tiempo del sistema. En java contamos con el método System.currentTimeMillis(); el cual nos retorna la hora en milisegundos. Entonces, lo que debemos hacer será declarar una variable llamada TInicio (tiempo de inicio) y otra llamada TFin (Tiempo final), luego restamos TFin con TInicio y eso nos dará el tiempo de ejecución. 

public class TEjecucion {
 public static void main(String[] ar){
  long TInicio, TFin, tiempo; //Variables para determinar el tiempo de ejecución
  TInicio = System.currentTimeMillis(); //Tomamos la hora en que inicio el algoritmo y la almacenamos en la variable inicio
  //ALGORITMO 
  //
  //
  //ALGORITMO
  //
  //
  //ALGORITMO
  //
  //
  //ALGORITMO
TFin = System.currentTimeMillis(); //Tomamos la hora en que finalizó el algoritmo y la almacenamos en la variable T tiempo = TFin - TInicio; //Calculamos los milisegundos de diferencia System.out.println("Tiempo de ejecución en milisegundos: " + tiempo); //Mostramos en pantalla el tiempo de ejecución en milisegundos
}

Como podemos observar se crean 3 variables (TInicio, TFin, tiempo) de tipo long (enteros muy largos). Antes de hacer cualquier operación e incluso antes de declarar otras variables (variables pertenecientes al algoritmo) asignamos el valor del tiempo en milisegundos en ese instante a la variable TInicio, posterior a eso ejecutamos todo nuestro algoritmo y operaciones a realizar. Al final, asignamos el tiempo en milisegundos a la variable TFin, obtenemos la diferencia entre ambos tiempos e imprimimos el tiempo de ejecución en milisegundos. 

Hagamos una prueba...

En la entrada sobre convertir números de sistema decimal a sistema binario en c++ y Java se muestran dos ejemplos para cada uno de estos lenguajes, ahora bien, tomando como ejemplo el primero de estos ¿Que tan rápido puede ser este algoritmo? Midamos el tiempo de ejecución. 

import java.util.Scanner;

public class DecimalABinario {
 public static void main(String[] ar){
 long TInicio, TFin, tiempo;           //Para determinar el tiempo
 TInicio = System.currentTimeMillis(); //de ejecución
 Scanner teclado = new Scanner(System.in);
 int dividendo, resto, divisor = 2, numero = 71; //inicializamos la variable número con el fin de que nuestro algoritmo se ejecute inmediatamente sin necesidad de introducir un valor de entrada
 String binario = "";
 System.out.println("Ingrese el numero decimal a convertir a sistema binario");
 //numero = teclado.nextInt();
 dividendo = numero;
 while(dividendo >= divisor){ //Mientras el dividendo sea mayor o igual que el divisor, es decir, mayor o igual que 2.
 resto = dividendo % 2;
  if(resto == 1)
   binario = "1" + binario; //Si el resto es igual a 1 concatenamos 1 a la variable string llamada binario
  else
   binario = "0" + binario; // Sino concatemanos 0
  //Es importante este orden de concatenación (primero el bit y luego el valor de la variable) esto para que nuestro número
  //en sistema binario esté ordenado correctamente.
   dividendo = dividendo/divisor; // Actualizamos el valor del dividendo dividiendolo entre 2.
 }
  if(dividendo == 1)
   binario = "1" + binario; // Por último sí el valor final del dividendo es 1 concatenamos 1 sino concatenamos 0.
  else
   binario = "0" + binario;
  System.out.println("En sistema binario " + numero + " se escribe " + binario);
  TFin = System.currentTimeMillis();
  tiempo = TFin - TInicio;
  System.out.println("Tiempo de ejecución en milisegundos: " + tiempo);
 }
}

Se puede notar que es un poco distinto al algoritmo de la entrada anteriormente mencionada, esto debido a que hemos agregado el procedimiento que nos proporcionará su tiempo de ejecución. Se ha colocado la lectura del dato de entrada como un comentario (el número decimal a convertir a sistema binario) es decir, el método //numero = teclado.nextInt(); así como también inicializado en 71 la variable numero puesto que el tiempo que tarda el usuario en ingresar un valor de entrada puede variar.   

Ejecución: 

Ingrese el numero decimal a convertir a sistema binario
En sistema binario 71 se escribe 1000111
Tiempo de ejecución en milisegundos: 98


También te podría interesar:
De sistema decimal a sistema binario en c++ y Java
3 libros sobre programacion orientada a objetos
Curso Online Programacion Orientada a Objetos (JAVA, MVC)
Generar número aleatorio en Java Math.random()


¡Ayúdanos a seguir creciendo, comparte en tus Redes Sociales!

Siguiente
« Prev Post
Anterior
Next Post »

3 comentarios

Click here for comentarios
Anónimo
admin
6 de febrero de 2015, 11:58 ×

A que no lo haces con la classe GregorianCalendar¿?

Reply
avatar
1 de noviembre de 2016, 23:12 ×

Muchas gracias por el aporte :) muy bien explicado.

Reply
avatar
Tamara
admin
4 de enero de 2017, 12:01 ×

Muchísimas gracias Francisco, acabo de solucionar el problema que tenia :)

Reply
avatar