Como faço para calcular o tempo decorrido de um evento em java? [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
- Como o tempo de execução de um método em Java? 37 respostas
O que é uma maneira simples / fácil de acessar o relógio do sistema usando Java, para que eu possa calcular o tempo decorrido de um evento?
Solução
Gostaria de evitar usando System.currentTimeMillis()
para medir o tempo decorrido. currentTimeMillis()
retorna o 'muro -Clock' tempo, o que pode mudar (por exemplo: o horário de verão, usuário admin mudar o relógio) e distorcer suas medições do intervalo.
System.nanoTime()
, por outro lado, devolve o número de nanossegundos desde um qualquer 'ponto de referência' (por exemplo, JVM arranque), e, por conseguinte, não seria susceptível a alterações do relógio do sistema.
Outras dicas
Este é um código de exemplo.
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Apache Commons-Lang também tem a classe StopWatch adequado apenas para o seu propósito. Ele usa System.currentTimeMillis (), então você ainda tem problemas de resolução, mas você pode fazer uma pausa e fazer tempos de volta e tal. Eu usá-lo como padrão agora para estatísticas de eventos.
http: // commons. apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
A resposta por Leigh está correto.
java.time
Java 8 e posterior tem a estrutura java.time construído em.
Um Instant
é um momento na linha do tempo em UTC com resolução de nanossegundos (até 9 dígitos de uma fração decimal de um segundo). As garras do método now
o momento de data e hora atual.
Instant now = Instant.now();
2016-03-12T04: 29: 39.123Z
Você pode calcular o tempo decorrido entre um par de objetos Instant
como Duration
. A resolução nanossegundo usos duração com um valor máximo de segundos que podem ser realizadas em um longo. Esta é maior do que a idade atual estimada do universo.
Duration duration = Duration.between( startInstant , stopInstant );
A saída padrão de Duration::toString
é em ISO 8601 padrão. Você também pode pedir uma contagem total de nanossegundos ( toNanos
) ou milissegundos ( toMillis
), bem como os demais valores.
Java 8
Em Java 8, buscando a resolução da atual momento apenas para milissegundo resolução (até 3 dígitos de uma fração decimal de um segundo). Assim, enquanto as classes java.time podem Loja nanossegundos eles só podem determinar o momento atual com milissegundos. Esta limitação é devido a um problema de legado (o padrão Clock
usos implementação System.currentTimeMillis()
).
Java 9
Em Java 9 e posterior, a implementação Clock
padrão pode determinar o momento atual em até resolução de nanossegundos. Na verdade, isso depende da finura de hardware relógio do seu computador.
Veja esta página questão OpenJDK para mais informações: aumentar a precisão da execução do java .time.Clock.systemUTC ()
Micro benchmark
Se o seu objetivo é o benchmarking, não se esqueça de olhar para outras questões, tais como:
- Como posso escrever uma micro-referência correto em Java?
- Criar rápida / referência fiável com java?
Frameworks estão disponíveis para ajudar com curta duração de benchmarking.
java.lang.System.currentTimeMillis()
ou java.lang.System.nanoTime()
deve trabalhar para medir o tempo decorrido.
Aqui está uma pequena classe StopWatch eu escrevi usando o System.nanoTime () como sugerido na resposta de Leigh:
public class StopWatch {
// Constructor
public StopWatch() {
}
// Public API
public void start() {
if (!_isRunning) {
_startTime = System.nanoTime();
_isRunning = true;
}
}
public void stop() {
if (_isRunning) {
_elapsedTime += System.nanoTime() - _startTime;
_isRunning = false;
}
}
public void reset() {
_elapsedTime = 0;
if (_isRunning) {
_startTime = System.nanoTime();
}
}
public boolean isRunning() {
return _isRunning;
}
public long getElapsedTimeNanos() {
if (_isRunning) {
return System.nanoTime() - _startTime;
}
return _elapsedTime;
}
public long getElapsedTimeMillis() {
return getElapsedTimeNanos() / 1000000L;
}
// Private Members
private boolean _isRunning = false;
private long _startTime = 0;
private long _elapsedTime = 0;
}