Domanda

È System.currentTimeMillis () la migliore misura delle prestazioni tempo in Java? Ci sono gotcha quando si utilizza questo per confrontare il tempo prima che venga presa al momento in azione dopo viene eseguita l'azione? C'è un'alternativa migliore?

È stato utile?

Soluzione

Spero di no - è quello che uso quando non uso nanoTime() .

Altri suggerimenti

Oltre System.nanoTime(), JMX è probabilmente la migliore opzione praticabile:

java.lang.management.ManagementFactory.getThreadMXBean()

è possibile interrogare il tempo filo CPU corrente (misurata in nano secondi, ma non con nano secondi precisione, come per System.nanoTime ())

È possibile utilizzare Cronometro da Google Guava che rende la misurazione del tempo super-facile.

Se avete bisogno di misure di tempo monotone, System.nanoTime è una scelta migliore. System.currentTimeMillis è soggetta a variazioni UTC temporizzazione - secondo salto, aggiornamenti NTP e jitter, così come gli utenti di impostazione l'orologio di sistema *. Ciò può causare alcuni guasti spettacolari in certi tipi di applicazioni di temporizzazione. System.nanoTime dovrebbe essere immune da tutto questo.

I problemi con System.nanoTime includono overflow numerico giornali e imprecisioni tempi lungo termine, rendendo System.currentTimeMillis meglio per periodi di tempo più lunghi (a condizione che gli utenti lasciano solo l'orologio di sistema). Si noti che ora legale e ora cambiamenti di fuso non dovrebbe influire System.currentTimeMillis.

* Windows "Sync con il tempo internet" apporta modifiche graduali. Questo può essere molto dirompente, al contrario di una corretta applicazione client NTP che "insegue" il server regolando la frequenza di client base dei tempi.

Prima di Java 1.5 c'era solo System.currentTimeMillis. Tuttavia la granularità del valore dipende dal sistema operativo sottostante e può essere grande. In Windows XP a volte ho finito con le lacune di 20ms. Ho sentito Linux è il modo migliore con lacune nella gamma di 1-2ms.

Con Java 1.5 è possibile utilizzare anche System.nanoTime. Non ho mai avuto problemi con questo.

Una Gotcha è che questa misura il tempo reale trascorso, non il tempo di CPU - quindi è molto dipendente dal carico del sistema. Questo va bene se la vostra su una macchina altrimenti libero, ma a volte può produrre risultati interessanti se altri processi stanno cercando di fare il lavoro.

Questo articolo ha una soluzione intersting al problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top