2009-12-14 10 views
6

Sulla base delle idee presentate in link ho implementato diversi "metodi di sospensione" diversi. Uno di questi metodi è stato il "sonno binario", che assomiglia a questo:Il metodo System.currentTimeMillis() restituisce realmente l'ora corrente?

while (System.currentTimeMillis() < nextTimeStamp) 
{ 
sleepTime -= (sleepTime/2); 
sleep(sleepTime); 
} 

Perché il controllo se il passo temporale successivo è già raggiunta avviene all'inizio ho, ci si aspetta che il metodo è in esecuzione troppo a lungo . Ma la distribuzione cumulativa dell'errore di simulazione (tempo atteso - tempo reale) è la seguente: alt text http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg

Qualcuno ha un'idea del motivo per cui ottengo questi risultati? Forse il metodo System.currentTimeMillis() in realtà non restituisce l'ora corrente?

BR,

Markus

@irreputable

Quando feci la valutazione ho anche creato una curva a campana utilizzando un programma di statistica tedesco. Perché non era possibile cambiare didascalia, qui è la definizione inglese di tutti gli elementi rilevanti:

Häufigkeit = frequenza

Fehler = errore

Mittelwert = media

Std-Abw = Deviazione standard

alt text http://img694.imageshack.us/img694/2254/bellcurve.jpg

+1

Ho provato a fare una domanda su http://stackoverflow.com/questions/ask e ho copypasted il soggetto dell'argomento nella mia nuova domanda di test e mentre inserivo nel campo del messaggio, ho ottenuto un elenco di tutti (molto) rilevanti argomenti che già rispondono alla tua domanda. Mi stavo chiedendo se davvero l'hai notato e l'hai esplorato? – BalusC

+0

Ohhh, hai ragione. Forse dovrei guardare più spesso argomenti correlati prima di scrivere una domanda :-) – Markus

+0

+1 per la curva. sapevamo che non è preciso, ma è bello vedere qualche quantificazione. puoi fare una curva a campana? – irreputable

risposta

10

No non è così. Suo fratello minore System#nanoTime() ha una precisione molto migliore rispetto a System#currentTimeMillis().

Oltre alle risposte nel loro Javadoc (fare clic sui collegamenti qui sopra), questo argomento è stato discusso più volte anche qui. Effettua una ricerca su "currenttimemillis vs nanotime" e ti troverai sotto ogni argomento: System.currentTimeMillis vs System.nanoTime.

+2

nanoTime() ha una precisione migliore ma la precisione è sempre la stessa correnteTimeMillis() (dipende dal sistema operativo sottostante). Vedi http://en.wikipedia.org/wiki/Accuracy_and_precision –

+0

Grazie per l'heads up (l'inglese non è il mio nativo). L'ho risolto – BalusC

+1

Tuttavia .. Anche il tuo inglese non è buono. Dovrebbe essere "suo" (di esso) e non "è" (lo è): o) – BalusC

2

Per la documentazione,

* Returns the current time in milliseconds. Note that 
* while the unit of time of the return value is a millisecond, 
* the granularity of the value depends on the underlying 
* operating system and may be larger. For example, many 
* operating systems measure time in units of tens of 
* milliseconds. 
2

Quello che state vedendo è l'orologio sottostante la risoluzione di 15ms risoluzione. Questa è una caratteristica della velocità di interruzione del sistema operativo OS &. C'è una patch per il kernel linux per aumentare questa risoluzione a 1 ms, non sono sicuro di Windows. Ci sono già stati un certo numero di posts.

Problemi correlati