2009-08-07 9 views
6

Sto cronometrando alcune cose, che non posso semplicemente inserire in un ciclo lungo. E ho bisogno di tempo per vedere quanto tempo ci vuole per completare, ma sembra che il timer abbia una precisione di 15-16 ms in java? Come posso aggirare questo?Precisione del timer in java

risposta

8

Hai provato a utilizzare System.nanoTime()?

Dal Javadoc:

restituisce il valore corrente delle più preciso timer di sistema disponibili, in nanosecondi.

Questo metodo può essere utilizzato solo per misurare il tempo trascorso e non è correlato a nessun'altra nozione di orario del sistema o dell'orologio. Il valore restituito rappresenta i nanosecondi poiché alcuni tempi fissi ma arbitrari (forse in futuro, quindi i valori potrebbero essere negativi). Questo metodo fornisce precisione in nanosecondi, ma non necessariamente precisione in nanosecondi. Non viene fornita alcuna garanzia sulla frequenza con cui i valori cambiano. Le differenze nelle chiamate successive superiori a circa 292 anni (2 nanosecondi) non calcolano in modo accurato il tempo trascorso a causa dell'overflow numerico.

Ad esempio, per misurare il tempo del codice necessario per eseguire:

lungo startTime = System.nanoTime(); // ... il codice misurato ... long estimateTime = System.nanoTime() - startTime;

+6

eh, io amo quella frase: "Le differenze nelle chiamate successive che si estendono su una distanza superiore a circa 292 anni (263 nanosecondi) non calcolano in modo accurato il tempo trascorso a causa dell'overflow numerico." Ci dovrebbe essere un concorso per il programma software più longevo senza interruzioni/malfunzionamenti. –

4

Clocks and Timers - General Overview

programmazione Java API per gli orologi e timer La orologio assoluto "time-of-day" è rappresentata da il metodo System.currentTimeMillis(), che restituisce un millisecondo rappresentazione del tempo di orologio a muro in millisecondi dall'epoca. Come tale utilizza l'orologio "tempo del giorno" del sistema operativo. La risoluzione di aggiornamento di questo orologio è spesso la stessa dell'interrupt del timer (ad esempio 10 ms), ma su alcuni sistemi sono fissi, indipendentemente da la frequenza di interruzione.

L'orologio relativo-tempo è rappresentato dal metodo System.nanoTime(), che restituisce un tempo "free-running" in nanosecondi. Questa volta è utile solo per il confronto con altri valori nanoTime . Il metodo nanoTime utilizza l'orologio ad alta risoluzione disponibile sulla piattaforma e mentre il suo valore di ritorno è in nanosecondi, la risoluzione di aggiornamento è in genere solo microsecondi. Tuttavia, su alcuni sistemi non c'è altra scelta che usare la stessa fonte clock per currentTimeMillis() - per fortuna questa è rara e colpisce soprattutto i vecchi sistemi Linux, e Windows 98.