Ist System.currentTimeMillis() das beste Maß für die Zeitleistung in Java? Gibt es irgendwelche Fehler, wenn Sie dies verwenden, um die Zeit vor der Aktion mit der Zeit nach der Aktion zu vergleichen? Gibt es eine bessere Alternative?Ist System.currentTimeMillis() das beste Maß für die Zeitleistung in Java?
Antwort
Ich hoffe nicht - es ist was ich benutze, wenn ich nicht nanoTime()
verwende.
Ein Problem (auf Windows mit Sun JDK6, in jedem Fall) mit 'NanoTime' ist, dass der zurückgegebene Wert hängt von der CPU-Kernausführung der Faden. Wenn der Thread auf einem Kern ausgeführt wird und auf einem anderen Kern endet, sind Ihre Zahlen etwas aus. Ich hatte Code wie 'long start = System.nanoTime(); TU es(); long elapsedNanos = System.nanoTime() - start; 'und endete damit, dass 'elephantNanos' negativ war. – gustafc
Wenn zwischen der Start- und Endzeit der Thread suspendiert wurde, wird die Endzeit auch die Aussetzungszeit reflektieren. also ist der End-Start nicht die tatsächliche Zeit, die Thread in Ausführung verbracht hat. –
Vor Java 1.5 gab es nur System.currentTimeMillis. Die Granularität des Werts hängt jedoch vom zugrunde liegenden Betriebssystem ab und kann groß sein. Unter Windows XP hatte ich manchmal Lücken von 20 ms. Ich habe gehört, Linux ist viel besser mit Lücken im Bereich von 1-2ms.
Mit Java 1.5 können Sie auch System.nanoTime verwenden. Ich hatte nie Probleme mit diesem.
einen Blick auf diese:
Eine gotcha ist, dass diese in Echtzeit misst verstrichen ist, keine CPU-Zeit - es ist also auf Systemlast sehr abhängig. Dies ist in Ordnung, wenn Sie auf einem ansonsten freien Rechner arbeiten, aber manchmal interessante Ergebnisse erzielen, wenn andere Prozesse versuchen, Arbeit zu leisten.
This article hat eine interessante Lösung für das Problem.
Link ist down:/ –
Downvoted, weil die referenzierte Verbindung nicht mehr verfügbar ist. Bitte geben Sie die relevanten Informationen an. – ooxi
neben System.nanoTime()
, JMX ist wahrscheinlich die beste realisierbare Option:
java.lang.management.ManagementFactory.getThreadMXBean()
Sie aktuelle Thread CPU-Zeit abfragen können (gemessen in Nanosekunden, aber nicht mit Nanosekunden Präzision, wie für System.nanoTime
())
Wenn Sie monotone Zeitmessungen benötigen, ist System.nanoTime die bessere Wahl. System.currentTimeMillis unterliegt UTC-Timing-Variationen - Schaltsekunden, NTP-Updates und Jitter sowie Benutzern, die die Systemuhr * einstellen. Dies kann einige spektakuläre Fehler in bestimmten Arten von Timing-Anwendungen verursachen. System.nanoTime soll gegen all das immun sein.
Die Probleme mit System.nanoTime beinhalten periodischen numerischen Überlauf und langfristige Timing-Ungenauigkeit, was System.currentTimeMillis für längere Zeitspannen besser macht (vorausgesetzt, dass Benutzer die Systemuhr alleine lassen). Beachten Sie, dass Sommerzeit und Zeitzonenänderungen sich nicht auf System.currentTimeMillis auswirken sollten.
* Windows "Sync mit Internetzeit" macht schrittweise Änderungen. Dies kann sehr störend sein, im Gegensatz zu einer ordnungsgemäßen NTP-Client-Implementierung, die den Server "jagt", indem die Frequenz der Client-Zeitbasis angepasst wird.
Sie können Stopwatch from Google Guava verwenden, was die Messzeit superleicht macht.
gute Antwort hier http://StackOverflow.com/a/9458267/741970 –