Die Verwendung Time.now
(die die Wanduhrzeit zurückgibt) als Basislinie weist einige Probleme auf, die zu unerwartetem Verhalten führen können. Dies wird durch die Tatsache verursacht , dass die Zeit Wanduhr unterliegt Änderungen wie eingefügten Schaltsekunden oder Zeitschwenk die lokale Zeit zu einer Referenzzeit einzustellen.
Wenn während der Messung beispielsweise eine Schaltsekunde eingefügt wird, wird diese um eine Sekunde ausgeschaltet. Abhängig von den örtlichen Systembedingungen müssen Sie sich möglicherweise mit Sommerzeit, schnelleren oder langsamer laufenden Uhren oder sogar einem Zeitsprung der Uhr auseinandersetzen, was zu einer negativen Dauer und vielen anderen Problemen führt.
Eine Lösung für dieses Problem besteht darin, eine andere Uhrzeit zu verwenden: eine monotone Uhr. Dieser Uhrentyp hat andere Eigenschaften als die Wanduhr. Es erhöht sich monitonisch, dh es geht nie zurück und nimmt mit konstanter Geschwindigkeit zu. Damit stellt es nicht die Wanduhr dar (dh die Zeit, die Sie von einer Uhr an Ihrer Wand lesen), sondern einen Zeitstempel, den Sie mit einem späteren Zeitstempel vergleichen können, um einen Unterschied zu erhalten.
In Ruby können Sie einen solchen Zeitstempel Process.clock_gettime(Process::CLOCK_MONOTONIC)
wie folgt verwenden:
t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
sleep 1.5
t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
delta = t2 - t1
delta_in_milliseconds = delta * 1000
Das Process.clock_gettime
Methode gibt einen Zeitstempel als Float mit Sekundenbruchteilen zurück. Die tatsächlich zurückgegebene Nummer hat keine definierte Bedeutung (auf die Sie sich verlassen sollten). Sie können jedoch sicher sein, dass der nächste Anruf eine größere Nummer zurückgibt, und durch Vergleichen der Werte können Sie den Echtzeitunterschied ermitteln.
Diese Attribute machen die Methode zu einem Hauptkandidaten für die Messung von Zeitunterschieden, ohne dass Ihr Programm in den ungünstigsten Zeiten fehlschlägt (z. B. um Mitternacht an Silvester, wenn eine weitere Schaltsekunde eingefügt wird).
Die Process::CLOCK_MONOTONIC
hier verwendete Konstante ist auf allen modernen Linux-, BSD- und macOS-Systemen sowie auf dem Linux-Subsystem für Windows verfügbar. Es ist jedoch noch nicht für "rohe" Windows-Systeme verfügbar. Dort können Sie den GetTickCount64
Systemaufruf verwenden, der stattdessen Process.clock_gettime
auch einen Zeitgeberwert in Millisekunden-Granularität unter Windows zurückgibt (> = Windows Vista, Windows Server 2008).
Mit Ruby können Sie diese Funktion folgendermaßen aufrufen:
require 'fiddle'
GetTickCount64 = Fiddle::Function.new(
Fiddle.dlopen('kernel32.dll')['GetTickCount64'],
[],
-Fiddle::TYPE_LONG_LONG
)
timestamp = GetTickCount64.call / 1000.0