Hacer un cronómetro en Java
-
Cronómetro en Java usando
System.nanoTime()
- Cronómetro en Java con Apache Commons Lang
-
Cronómetro en Java usando
Instant
Podemos obtener el tiempo transcurrido de una tarea específica en Java utilizando varios métodos que veremos a continuación. Se necesita un cronómetro Java cuando la tarea es crucial y queremos saber el tiempo que tarda una tarea de larga duración, como calcular una serie de Fibonacci.
Cronómetro en Java usando System.nanoTime()
Queremos mantener el tiempo del cronómetro lo más preciso posible y, por lo tanto, usamos la clase System.nanotTime()
que devuelve el valor de nanosegundos que es el valor más preciso del temporizador del sistema.
En el programa, creamos dos clases, Stopwatch1
y Stopwatch
. En los dos métodos de Stopwatch1
para iniciar y detener el cronómetro, start()
inicializa el stopWatchStartTime
con los nanosegundos actuales utilizando System.nanoTime()
y establece el valor de stopWatchRunning
(comprueba si el cronómetro está corriendo) como true
.
stop()
inicializa el stopWatchStopTime
y establece stopWatchRunning
en false
. Luego, podemos usar cuatro funciones para calcular el tiempo total transcurrido en milisegundos, segundos, minutos y horas. Cada método tiene una variable local llamada elapsedTime
que almacena el valor que es el valor de System.nanoTime()
restado por el stopWatchStartTime
si el cronómetro está funcionando y no está funcionando, entonces hacemos stopWatchStopTime - stopWatchStartTime
.
Ahora, como el valor de elapsedTime
en cada función está en nanosegundos, convertimos su valor a diferentes unidades de tiempo dividiendo elapsedTime
por los nanosegundos que contiene.
En la clase Stopwatch
, creamos un objeto de Stopwatch1
y llamamos al método start()
. Luego llamamos al método que calcula la serie de Fibonacci usando el método de recursividad, y por último, llamamos a la función stop()
. El tiempo entre las funciones start()
y stop()
es el tiempo transcurrido que se muestra en la salida.
import java.math.BigInteger;
class Stopwatch1 {
private final long nanoSecondsPerMillisecond = 1000000;
private final long nanoSecondsPerSecond = 1000000000;
private final long nanoSecondsPerMinute = 60000000000L;
private final long nanoSecondsPerHour = 3600000000000L;
private long stopWatchStartTime = 0;
private long stopWatchStopTime = 0;
private boolean stopWatchRunning = false;
public void start() {
this.stopWatchStartTime = System.nanoTime();
this.stopWatchRunning = true;
}
public void stop() {
this.stopWatchStopTime = System.nanoTime();
this.stopWatchRunning = false;
}
public long getElapsedMilliseconds() {
long elapsedTime;
if (stopWatchRunning)
elapsedTime = (System.nanoTime() - stopWatchStartTime);
else
elapsedTime = (stopWatchStopTime - stopWatchStartTime);
return elapsedTime / nanoSecondsPerMillisecond;
}
public long getElapsedSeconds() {
long elapsedTime;
if (stopWatchRunning)
elapsedTime = (System.nanoTime() - stopWatchStartTime);
else
elapsedTime = (stopWatchStopTime - stopWatchStartTime);
return elapsedTime / nanoSecondsPerSecond;
}
public long getElapsedMinutes() {
long elapsedTime;
if (stopWatchRunning)
elapsedTime = (System.nanoTime() - stopWatchStartTime);
else
elapsedTime = (stopWatchStopTime - stopWatchStartTime);
return elapsedTime / nanoSecondsPerMinute;
}
public long getElapsedHours() {
long elapsedTime;
if (stopWatchRunning)
elapsedTime = (System.nanoTime() - stopWatchStartTime);
else
elapsedTime = (stopWatchStopTime - stopWatchStartTime);
return elapsedTime / nanoSecondsPerHour;
}
}
public class Stopwatch {
public static void main(String[] args) {
Stopwatch1 stopwatch1 = new Stopwatch1();
stopwatch1.start();
Fibonacci(45);
stopwatch1.stop();
System.out.println("Elapsed time in milliseconds: " + stopwatch1.getElapsedMilliseconds());
System.out.println("Elapsed time in seconds: " + stopwatch1.getElapsedSeconds());
System.out.println("Elapsed time in minutes: " + stopwatch1.getElapsedMinutes());
System.out.println("Elapsed time in hours: " + stopwatch1.getElapsedHours());
}
private static BigInteger Fibonacci(int n) {
if (n < 2)
return BigInteger.ONE;
else
return Fibonacci(n - 1).add(Fibonacci(n - 2));
}
}
Producción :
Elapsed time in milliseconds: 31161
Elapsed time in seconds: 31
Elapsed time in minutes: 0
Elapsed time in hours: 0
Cronómetro en Java con Apache Commons Lang
Para este ejemplo, usamos la biblioteca Apache Commons. A continuación se muestra la dependencia para incluirlo en nuestro proyecto.
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
Creamos un objeto de la clase StopWatch
stopWatch
que viene con la biblioteca y luego llamamos a la función start()
. Después de iniciar el cronómetro llamamos a la función Fibonacci()
y luego paramos el reloj usando stop()
. Ahora para obtener el tiempo transcurrido llamamos a stopWatch.getTime()
que devuelve el tiempo transcurrido y en getTime()
podemos pasar diferentes unidades de tiempo.
import java.math.BigInteger;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.time.StopWatch;
public class Stopwatch {
public static void main(String[] args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Fibonacci(40);
stopWatch.stop();
System.out.println(
"Get elapsed time in milliseconds: " + stopWatch.getTime(TimeUnit.MILLISECONDS));
System.out.println("Get elapsed time in seconds: " + stopWatch.getTime(TimeUnit.SECONDS));
System.out.println("Get elapsed time in minutes: " + stopWatch.getTime(TimeUnit.MINUTES));
System.out.println("Get elapsed time in hours: " + stopWatch.getTime(TimeUnit.HOURS));
}
private static BigInteger Fibonacci(int n) {
if (n < 2)
return BigInteger.ONE;
else
return Fibonacci(n - 1).add(Fibonacci(n - 2));
}
}
Producción :
Get elapsed time in milliseconds: 3483
Get elapsed time in seconds: 3
Get elapsed time in minutes: 0
Get elapsed time in hours: 0
Cronómetro en Java usando Instant
Instant
es parte del paquete java.time
. Devuelve el instante actual del reloj del sistema. Tenemos dos valores instantáneos usando Instant.now()
primero es antes de la ejecución de Fibonacci()
y uno después de la ejecución. Luego calculamos la diferencia entre ambos valores usando Duration.between()
donde pasamos los valores instatStarted
e instantStopped
que devuelve una Duration
que podemos convertir a diferentes unidades de tiempo como toMillis()
para milisegundos, toSeconds()
para segundos y para minutos usamos toMinutes()
.
import java.math.BigInteger;
import java.time.Duration;
import java.time.Instant;
public class Stopwatch {
public static void main(String[] args) {
Instant instantStarted = Instant.now();
Fibonacci(40);
Instant instantStopped = Instant.now();
Duration durationBetween = Duration.between(instantStarted, instantStopped);
System.out.println("Get elapsed time in milliseconds: " + durationBetween.toMillis());
System.out.println("Get elapsed time in seconds: " + durationBetween.toSeconds());
System.out.println("Get elapsed time in minutes: " + durationBetween.toMinutes());
}
private static BigInteger Fibonacci(int n) {
if (n < 2)
return BigInteger.ONE;
else
return Fibonacci(n - 1).add(Fibonacci(n - 2));
}
}
Producción :
Get elapsed time in milliseconds: 3510
Get elapsed time in seconds: 3
Get elapsed time in minutes: 0
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn