Präzision vs. Genauigkeit von System.nanoTime ()

Die Dokumentation fürSystem.nanoTime() sagt der folgende (Schwerpunkt meiner).

Diese Methode kann nur zum Messen der verstrichenen Zeit verwendet werden und steht in keinem Zusammenhang mit einem anderen Begriff der System- oder Wanduhrzeit. Der zurückgegebene Wert gibt Nanosekunden seit einer festgelegten, aber willkürlichen Zeit an (möglicherweise in der Zukunft, sodass die Werte möglicherweise negativ sind).Dieses Verfahren liefert eine Nanosekundengenauigkeit, jedoch nicht notwendigerweise eine Nanosekundengenauigkeit. Es wird keine Garantie dafür übernommen, wie häufig sich die Werte ändern.

Aus meiner Sicht kann dies auf zwei verschiedene Arten interpretiert werden:

Der Satz inFett gedruckt oben bezieht sich auf einzelne Rückgabewerte. Präzision und Genauigkeit sind dann im numerischen Sinne zu verstehen. Das heißt, Präzision bezieht sich auf die Anzahl der signifikanten Stellen - die Position der Kürzung, und Genauigkeit ist, ob die Zahl die richtige ist (wie in der oberen Antwort hier beschrieben)Was ist der Unterschied zwischen "Präzision" und "Genauigkeit"? )

Der Satz inFett gedruckt oben bezieht sich auf die Fähigkeit des Verfahrens selbst. Präzision und Genauigkeit sind dann so zu verstehen, wie es die Analogie der Dartscheibe zeigt (http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy ). Niedrige Genauigkeit, hohe Präzision => Der falsche Wert wird wiederholt mit hoher Präzision getroffen: Wenn Sie sich vorstellen, dass die physikalische Zeit stillsteht, geben aufeinanderfolgende Aufrufe von nanoTime () denselben numerischen Wert zurück, jedoch nicht die tatsächliche verstrichene Zeit seit dem Referenzzeit von einigenKonstante Offset.

Welche Interpretation ist die richtige? Mein Punkt ist, Interpretation 2 würde bedeuten, dass ein Maß für die ZeitUnterschied Die Verwendung von nanoTime () (durch Subtrahieren von zwei Rückgabewerten) wäre auf die Nanosekunde genau (da der konstante Fehler / Offset in der Messung beseitigt würde), während Interpretation 1 diese Art der Übereinstimmung zwischen Messungen nicht garantieren würde und dies nicht der Fall wäre erfordern zwangsläufig eine hohe Genauigkeit der Zeitdifferenzmessungen.

Aktualisiert am 15.04.13: Die Java 7-Dokumentation fürSystem.nanoTime() wurde aktualisiert, um mögliche Verwechslungen mit dem vorherigen Wortlaut zu beseitigen.

Gibt den aktuellen Wert der hochauflösenden Zeitquelle der laufenden Java Virtual Machine in Nanosekunden zurück.

Diese Methode kann nur zum Messen der verstrichenen Zeit verwendet werden und steht in keinem Zusammenhang mit einem anderen Begriff der System- oder Wanduhrzeit. Der zurückgegebene Wert stellt Nanosekunden dar, da einige fest, aber willkürlich sindUrsprung Zeit (möglicherweise in der Zukunft, daher können die Werte negativ sein). Derselbe Ursprung wird von allen Aufrufen dieser Methode in einer Instanz einer virtuellen Java-Maschine verwendet. Andere Instanzen virtueller Maschinen verwenden wahrscheinlich einen anderen Ursprung.

Diese Methode liefert eine Nanosekundengenauigkeit, aber nicht unbedingt eine Nanosekundenauflösung (das heißt, wie oft sich der Wert ändert). Es werden keine Garantien abgegeben, außer dass die Auflösung mindestens so gut ist wie die voncurrentTimeMillis().

Unterschiede bei aufeinanderfolgenden Aufrufen, die länger als ungefähr 292 Jahre dauern (263 Nanosekunden) berechnet die abgelaufene Zeit aufgrund eines numerischen Überlaufs nicht korrekt.

Die von dieser Methode zurückgegebenen Werte sind nur dann von Bedeutung, wenn die Differenz zwischen zwei solchen Werten, die in derselben Instanz einer virtuellen Java-Maschine ermittelt wurden, berechnet wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage