2012-04-05 8 views
0

Ich benutze system.nanoTime in meiner App und ich berechne Zeit relativ zu einer Startzeit.
Meine App lief sehr gut, bis ich sie auf einen neuen Computer kopiert habe und die Nanozeit gibt mir langsamere Werte.java - system.nanoTime() läuft zu langsam

Ich schrieb eine einfache App nur um sicher zu gehen.
wird die Nanozeit mit der Systemzeit verglichen.
Es zeigt die gleichen Werte in anderen Computern außer meinem neuen. irgendwelche Vorschläge?

Hier ist mein Code: Zuerst habe ich einen Thread

private long initNanoTime = System.nanoTime(); 
private long initTime = System.currentTimeMillis(); 

als ich Schleife, die jede Sekunde läuft:

long timeUsingNanoTime = initTime + (System.nanoTime() - initNanoTime)/1000000; 
long timeUsingMilis = System.currentTimeMillis(); 
long nanotimeOffset = Math.abs(timeUsingNanoTime - timeUsingMilis); 
if (nanotimeOffset < 100l) ? print("close") : print(far); 

Edit: Ich nano verwende, weil ich selbst ts behandeln müssen die in Nano-Zeit auftreten und zu einem Protokoll die Nano-Zeit, die es in

empfangen wurde
+1

Was meinst du mit "gibt mir langsamere Werte". Wird die Ausführung der Methode länger dauern oder erhalten Sie einen Wert, den Sie nicht erwarten? Vielleicht könnte dies Ihnen helfen http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime – SWoeste

Antwort

6

Es ist wie die Java-API-Dokumente sagen über System.nanoTime():

Diese Methode kann nur die verstrichene Zeit zu messen und ist nicht irgendeinem anderen Begriff des Systems oder Wandtaktzeit im Zusammenhang verwendet werden. Der zurückgegebene Wert entspricht Nanosekunden seit einigen festen, aber beliebigen Ursprung Zeit (vielleicht in der Zukunft, so dass Werte negativ sein können). Der gleiche Ursprung wird von allen Aufrufen dieser Methode in einer Instanz einer Java Virtual Machine verwendet; andere VM-Instanzen sind wahrscheinlich verwenden einen anderen Ursprung.

Diese Methode bietet Nanosekunde Präzision, aber nicht unbedingt Nanosekunde Auflösung (das heißt, wie häufig die Wertänderungen) - keine Garantien außer gemacht werden, dass die Auflösung mindestens so gut wie dass der currentTimeMillis().

Es bietet keine Kopplung mit dem Zeitstempel (currentTimeMillis) und bietet keine feste Auflösung.

In Ihrem Fall scheint Java jetzt einen Timer mit einer höheren Auflösung als zuvor zu haben und muss daher die Systemzeit nicht verwenden.

+0

Ist das zuverlässiger als die 6 und 5-Version von Nanotime http://docs.oracle.com/javase /6/docs/api/java/lang/System.html#nanoTime%28%29 – Jeb

+0

Sie sagen beide grundsätzlich das Gleiche. Beide behaupten, dass 'nanoTime' nicht an einen bestimmten Ursprung gekoppelt ist, so dass man sich nicht darauf verlassen kann. Sie haben nur einige weitere Erklärungen in den Java7-Dokumenten hinzugefügt. – Neet