Faça um cronômetro em Java

Rupam Yadav 12 outubro 2023
  1. Cronômetro em Java usando System.nanoTime()
  2. Cronômetro em Java usando Apache Commons Lang
  3. Cronômetro em Java usando Instant
Faça um cronômetro em Java

Podemos obter o tempo decorrido de uma tarefa específica em Java usando vários métodos que veremos a seguir. Um cronômetro java é necessário quando a tarefa é crucial em termos de tempo e queremos saber o tempo gasto por uma tarefa de longa execução, como calcular uma série de Fibonacci.

Cronômetro em Java usando System.nanoTime()

Queremos manter o tempo do cronômetro o mais preciso possível e, portanto, para fazer isso, usamos a classe System.nanotTime() que retorna o valor de nanossegundos que é o valor mais preciso do cronômetro do sistema.

No programa, criamos duas classes, Stopwatch1 e Stopwatch. Em Stopwatch1 dois métodos para iniciar e parar o cronômetro, start() inicializa o stopWatchStartTime com os nanossegundos atuais usando System.nanoTime() e define o valor de stopWatchRunning (verifica se o cronômetro é em execução) como true.

stop() inicializa o stopWatchStopTime e define stopWatchRunning como false. Então, podemos usar quatro funções para calcular o tempo total decorrido em milissegundos, segundos, minutos e horas. Cada método tem uma variável local chamada elapsedTime que armazena o valor que é o valor de System.nanoTime()subtraído por stopWatchStartTime se o cronômetro está rodando e não está rodando, então fazemos stopWatchStopTime - stopWatchStartTime.

Agora, como o valor de elapsedTime em cada função está em nanossegundos, convertemos seu valor em unidades de tempo diferentes dividindo elapsedTime pelos nanossegundos que contém.

Na classe Stopwatch, criamos um objeto de Stopwatch1 e chamamos o método start(). Em seguida, chamamos o método que calcula a série de Fibonacci usando o método de recursão e, por fim, chamamos a função stop(). O tempo entre as funções start() e stop() é o tempo decorrido mostrado na saída.

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));
  }
}

Produção:

Elapsed time in milliseconds: 31161
Elapsed time in seconds: 31
Elapsed time in minutes: 0
Elapsed time in hours: 0

Cronômetro em Java usando Apache Commons Lang

Para este exemplo, usamos a biblioteca Apache Commons. Abaixo está a dependência para incluí-lo em nosso projeto.

 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-lang3</artifactId>
     <version>3.11</version>
 </dependency>

Criamos um objeto da classe StopWatch stopWatch que vem com a biblioteca e, em seguida, chamamos a função start(). Depois de iniciar o cronômetro, chamamos a função Fibonacci() e então paramos o relógio usando stop(). Agora para obter o tempo decorrido chamamos stopWatch.getTime() que retorna o tempo decorrido e em getTime() podemos passar unidades de tempo diferentes.

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));
  }
}

Produção:

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 em Java usando Instant

Instant faz parte do pacote java.time. Ele retorna o instante atual do relógio do sistema. Nós dois valores instantâneos usando Instant.now() primeiro é antes da execução de Fibonacci() e um após a execução. Em seguida, calculamos a diferença entre os dois valores usando Duration.between() onde passamos os valores instatStarted e instantStopped que retorna uma Duration que podemos converter em unidades de tempo diferentes como toMillis()para milissegundos, toSeconds() para segundos e 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));
  }
}

Produção:

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