Domanda

    

Questa domanda ha già una risposta qui:

         

Qual è un modo semplice / facile per accedere all'orologio di sistema usando Java, in modo da poter calcolare il tempo trascorso di un evento?

È stato utile?

Soluzione

Eviterei di usare System.currentTimeMillis () per misurare il tempo trascorso. currentTimeMillis () restituisce l'ora dell '"orologio da parete", che può cambiare (ad esempio: ora legale, utente amministratore che cambia l'orologio) e distorcere le misurazioni dell'intervallo.

System.nanoTime () , d'altra parte, restituisce il numero di nanosecondi da "un punto di riferimento" (ad esempio, l'avvio di JVM) e non sarebbe quindi suscettibile alle modifiche dell'orologio di sistema.

Altri suggerimenti

Questo è un codice di esempio.

long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");

Apache Commons-Lang ha anche la classe StopWatch adatta solo per il tuo scopo. Utilizza System.currentTimeMillis (), quindi avrai ancora problemi di risoluzione, ma puoi mettere in pausa e fare i tempi sul giro e così via. Lo uso come standard ora per le statistiche degli eventi.

http: // commons. apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html

La Risposta di Leigh è corretta.

java.time

Java 8 e versioni successive hanno il framework java.time incorporato.

Un Instant è un momento nella sequenza temporale in UTC con risoluzione di nanosecondi (fino a 9 cifre di una frazione decimale di secondo). Il now il metodo prende il momento della data e ora corrente.

Instant now = Instant.now();
  

2016-03-12T04: 29: 39.123Z

Puoi calcolare il tempo trascorso tra una coppia di oggetti Instant come Duration . La durata utilizza una risoluzione di nanosecondi con un valore massimo di secondi che può essere tenuto in un lungo. Questo è maggiore dell'attuale età stimata dell'universo.

Duration duration = Duration.between( startInstant , stopInstant );

L'output predefinito di < code> Duration :: toString è nello standard ISO 8601 formato. Puoi anche richiedere un conteggio totale di nanosecondi ( toNanos ) o millisecondi ( toMillis ), così come altri importi.

Java 8

In Java 8, il recupero del momento corrente si risolve solo in una risoluzione di millisecondi (fino a 3 cifre di una frazione decimale di secondo). Pertanto, mentre le classi java.time possono archiviare nanosecondi, possono solo determinare il momento attuale con millisecondi. Questa limitazione è dovuta a un problema legacy (l'impostazione predefinita < code> Clock l'implementazione utilizza System.currentTimeMillis () ).

Java 9

In Java 9 e versioni successive, l'implementazione predefinita Clock può determinare il momento attuale con una risoluzione fino a nanosecondi. In realtà farlo dipende dalla finezza dell'hardware dell'orologio del tuo computer.

Vedi questa pagina del problema OpenJDK per maggiori informazioni: Aumenta la precisione dell'implementazione di java .time.Clock.systemUTC ()

Micro Benchmark

Se il tuo scopo è il benchmarking, assicurati di guardare altre domande come:

I frame sono disponibili per aiutare con benchmark di breve durata.

java.lang.System.currentTimeMillis () o java.lang.System.nanoTime () dovrebbe funzionare per misurare il tempo trascorso.

Ecco una piccola classe StopWatch che ho scritto usando System.nanoTime () come suggerito nella risposta di 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top