Pergunta

Esta questão já tem uma resposta aqui:

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?

Foi útil?

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:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top