Mostrando entradas con la etiqueta tiempo ejecucion. Mostrar todas las entradas
Mostrando entradas con la etiqueta tiempo ejecucion. Mostrar todas las entradas

lunes, 14 de julio de 2014

Medir el tiempo de ejecución en Java – PHD – Miami – Shipping



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étodoSystem.currentTimeMillis(); el cual nos retorna la hora enmilisegundos.Entonces, lo que debemos hacer será declarar unavariable llamadaTInicio (tiempo de inicio) y otra llamadaTFin (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 tipolong (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úmerosde 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 lavariable 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()