Come posso calcolare il tempo trascorso di un evento in Java? [duplicare]
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?
Soluzione
Eviterei di usare 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:
- Come posso scrivere un micro-benchmark corretto in Java?
- Creare benchmark rapidi / affidabili con Java?
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;
}