Hacer un cronómetro en Java

Rupam Yadav 12 octubre 2023
  1. Cronómetro en Java usando System.nanoTime()
  2. Cronómetro en Java con Apache Commons Lang
  3. Cronómetro en Java usando Instant
Hacer un cronómetro en Java

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 Yadav avatar Rupam Yadav avatar

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