Präzise Zeitmessung in Java
Java gibt zwei Methode, um die aktuelle Zeit: System.nanoTime()
und System.currentTimeMillis()
. Den ersten gibt man ein Ergebnis in Nanosekunden, aber die tatsächliche Genauigkeit ist viel schlimmer als das (viele Mikrosekunden).
Ist die JVM bereits die Bereitstellung der besten Wert für jede bestimmte Maschine?
Ansonsten gibt es eine Java-Bibliothek, um eine feinere Messung, die möglicherweise durch die Kopplung an ein bestimmtes system?
InformationsquelleAutor der Frage penpen | 2009-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem mit der immer super präzise Messungen der Zeit ist, dass einige Prozessoren können nicht/sind nicht solche winzigen Schritten.
Soweit ich weiß,
System.currentTimeMillis()
undSystem.nanoTime()
ist die beste Messung werden Sie in der Lage sein zu finden.Beachten Sie, dass beide zurückgeben
long
Wert.InformationsquelleAutor der Antwort jjnguy
Es ist ein bisschen sinnlos in Java-Messung der Zeit bis zu den Nanosekunden-Skala; eine gelegentliche GC-Treffer leicht auszulöschen jede Art von Genauigkeit, die diese gegeben haben kann. In jedem Fall, die Dokumentation besagt, dass, während es gibt Nanosekunden-Präzision, es ist nicht das gleiche wie Nanosekunden-Genauigkeit; und es gibt Betriebssysteme, die nicht melden, Nanosekunden, in jedem Fall (das ist, warum Sie finden Sie Antworten quantisiert 1000, wenn auf Sie zugreifen können; es ist nicht Glück, es ist die Einschränkung).
Nicht nur das, aber je nachdem, wie die Funktion tatsächlich in die Praxis umgesetzt, indem Sie die OS, die Sie finden können quantisiert Ergebnisse kommen doch durch (z.B. Antworten, die am Ende immer in 64 oder 128 statt der Zwischenwerte).
Es ist auch erwähnenswert, dass der Zweck der Methode ist es, finden die beiden Zeit, die Unterschiede zwischen einigen (in der Nähe) zu beginnen Zeit, und jetzt, wenn Sie sich System.nanoTime() am Anfang einer lang andauernde Anwendung, und nehmen Sie dann System.nanoTime() eine lange Zeit später, es möglicherweise driftete ziemlich weit von der realen Zeit. So sollten Sie nur wirklich nutzen es für Zeiträume von weniger als 1s; wenn Sie eine längere Laufzeit als,, Millisekunden sollten reichen. (Und wenn nicht, dann machen die letzten paar zahlen; wahrscheinlich werden Sie Ihre Kunden beeindrucken und das Ergebnis wird einfach als gültig).
InformationsquelleAutor der Antwort AlBlue
Leider, ich glaube nicht, dass java RTS ist reif genug, in diesem moment.
Java mal versuchen, einen optimalen Wert (Sie haben tatsächlich delegieren die nativen code aufrufen, erhalten Sie die kernal-Zeit). Allerdings JVM-Spezifikationen machen diese groben Zeit-Messung Haftungsausschluss hauptsächlich für Dinge wie die GC-Aktivitäten und die Unterstützung des zugrunde liegenden Systems.
Ich habe nicht herausgefunden, wie #1 es sei denn, Ihre app muss keine GC. Eine anständige und med Größe Anwendung wohl, und gelegentlich verbringt wie zig Millisekunden auf den GC-Pausen. Wahrscheinlich sind Sie aus Glück heraus, wenn Sie Ihre Präzision Voraussetzung ist niedriger 10ms.
Als für #2, Sie können tunen Sie den linux-kernal zu geben, mehr Präzision. Jedoch, Sie sind auch immer weniger aus Ihrer box, weil jetzt kernal Kontext wechseln öfter.
Vielleicht sollten wir es betrachten, verschiedene Blickwinkel. Gibt es einen Grund, dass OPS Bedürfnisse Genauigkeit von 10ms niedriger? Ist es okay zu sagen, Ops, die Präzision ist bei 10ms UND auch ein Blick auf die GC-log zu dieser Zeit, so dass Sie wissen, die Zeit ist mit + /- 10ms genau ohne GC-Aktivität, um diese Zeit?
InformationsquelleAutor der Antwort Oscar Chan
Wenn Sie schauen, um zu nehmen für eine Art von Phänomen in der Größenordnung von Nanosekunden, was Sie wirklich brauchen, ist ein real-time operating system. Die Genauigkeit der timer wird maßgeblich davon abhängen, dass das Betriebssystem bei der Umsetzung der high-resolution timer und der zugrunde liegenden hardware.
Allerdings können Sie den Aufenthalt noch mit Java da RTOS-Versionen verfügbar.
InformationsquelleAutor der Antwort James Jones
JNI:
Erstellen Sie eine einfache Funktion, um den Zugriff auf die Intel RDTSC instruction, oder die PMCCNTR register der co-Prozessor p15 im ARM.
Reine Java:
Können Sie möglicherweise bessere Werte, wenn Sie bereit sind, zu verzögern, bis ein Taktzyklus. Sie können spin-Kontrolle-System.nanoTime (), bis der Wert geändert wird. Wenn Sie wissen zum Beispiel, dass der Wert von System.nanoTime() ändert alle 10000 schleifendurchläufe auf Ihrer Plattform durch die Menge-DELTA, dann das eigentliche Ereignis der Zeit war finalNanoTime-DELTA*ITERATIONEN/10000. Sie müssen zum "warm-up" der code vor der Einnahme von tatsächlichen Messungen.
Hack (für die Profilerstellung, etc.):
Wenn die garbage collection zu werfen Sie aus, könnten Sie immer die Zeit Messen, die mit einem thread mit hoher Priorität läuft, in eine zweite jvm, die nicht Objekte erstellen. Es haben spin Inkrementieren eines long im gemeinsamen Speicher, die Sie verwenden, wie eine Uhr.
InformationsquelleAutor der Antwort William Deans