Faça um cronômetro em Java
-
Cronômetro em Java usando
System.nanoTime()
- Cronômetro em Java usando Apache Commons Lang
-
Cronômetro em Java usando
Instant
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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn