Synopsis: Als ich den Umgang mit dem Argument "clock_gettime (2)" in jeder Sprache untersuchte, fand ich einen so seltsamen Satz. Aufgrund dieser Umstände gibt es keine Beschreibung für Windows. Ich kann es später hinzufügen.
clock_gettime
clock_gettime (2)
ist eine API zur Zeiterfassung, die durch die Single Unix Specification v2 standardisiert ist. Für "clock_gettime (2)" ändern sich die Semantik und Genauigkeit der Zeiterfassung in Abhängigkeit von der an "clock_id" übergebenen Konstante.
Um ein Beispiel eines Linux-Mannes zu zitieren
- CLOCK_REALTIME
Eine systemweit einzigartige Zeit, die Echtzeit misst. Zum Einstellen dieser Uhr sind entsprechende Berechtigungen erforderlich. Diese Uhr ist eine diskontinuierliche Änderung der Systemzeit(Zum Beispiel, wenn der Systemadministrator die Systemzeit manuell ändert.)Es wird durch die schrittweisen Anpassungen beeinflusst, die von adjtime und NTP vorgenommen werden.
CLOCK_REALTIME_COARSE (Linux 2.6.32 oder später;Linux-spezifisch)
Schnelle, aber wenig genaue UHR_ECHTZEIT. Es wird empfohlen, es zu verwenden, wenn Geschwindigkeit sehr wichtig ist und kein hochpräziser Zeitstempel erforderlich ist.
CLOCK_MONOTONIC
Eine Uhr, die nicht eingestellt werden kann und als monotone Anstiegszeit ab einem bestimmten Startpunkt ausgedrückt wird.(Es ist nicht angegeben, wann die Startzeit sein wird).. Diese Uhr hat diskontinuierliche Änderungen der Systemzeit(Zum Beispiel, wenn der Systemadministrator die Systemzeit manuell ändert.)Nicht betroffen von, aber adjtime(3)Und sind von den schrittweisen Anpassungen durch NTP betroffen.
CLOCK_MONOTONIC_COARSE (Linux 2.6.32 oder später;Linux-spezifisch)
Schnelle, aber wenig genaue UHR_MONOTONISCH. Es wird empfohlen, es zu verwenden, wenn Geschwindigkeit sehr wichtig ist und kein hochpräziser Zeitstempel erforderlich ist.
CLOCK_MONOTONIC_RAW (Linux 2.6.28 oder später;Linux-spezifisch)
CLOCK_Ähnlich wie MONOTONIC, jedoch mit NTP-Anpassungen und Adjtime(3)Bietet Hardware-Zugriff auf die Rohzeit, unabhängig von den schrittweisen Anpassungen von.
CLOCK_BOOTTIME (Linux 2.6.39 oder später;Linux-spezifisch)
CLOCK_Wie MONOTONIC, außer dass es auch die Zeit enthält, zu der das System angehalten wird. Damit kann die Anwendung auch angehaltene Zustände verarbeiten"monotonic"Uhr kann erhalten werden. Außerdem UHR_In REALTIME muss keine komplizierte Verarbeitung durchgeführt werden. UHR_In REALTIME, Settimeofday(2)Dies liegt daran, dass sich die Zeit diskontinuierlich ändert, wenn Sie die Zeit mit ändern.
ein. Diese Konstante variiert je nach Betriebssystem. Andere, wie z. B. Sierra, haben eine spezielle API namens "clock_gettime_nsec_np" hinzugefügt.
In diesem Blog war der zitierte Teil der Implementierung hilfreich. http://d.hatena.ne.jp/yohei-a/20140913/1410628229
Ruby
Process.clock_gettime
Ruby bietet eine API, die clock_gettime (2)
direkt aufruft. Geben Sie im Argument von Process.clock_gettime "clock_id" an.
Gemäß process.c können die folgenden Konstanten angegeben werden. Es beschreibt auch, welche Version richtig hinzugefügt wurde, was sehr wunderbar ist. Unter Solaris gab es keine Spezifikation für CLOCK_HIGHRES. Dragonfly BSD sollte zumindest in der neuesten Version dieselben Optionen wie FreeBSD verwenden können, wurde jedoch nicht erwähnt.
* [CLOCK_REALTIME] SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12
* [CLOCK_MONOTONIC] SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12
* [CLOCK_PROCESS_CPUTIME_ID] SUSv3 to 4, Linux 2.5.63, OpenBSD 5.4, macOS 10.12
* [CLOCK_THREAD_CPUTIME_ID] SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12
* [CLOCK_VIRTUAL] FreeBSD 3.0, OpenBSD 2.1
* [CLOCK_PROF] FreeBSD 3.0, OpenBSD 2.1
* [CLOCK_REALTIME_FAST] FreeBSD 8.1
* [CLOCK_REALTIME_PRECISE] FreeBSD 8.1
* [CLOCK_REALTIME_COARSE] Linux 2.6.32
* [CLOCK_REALTIME_ALARM] Linux 3.0
* [CLOCK_MONOTONIC_FAST] FreeBSD 8.1
* [CLOCK_MONOTONIC_PRECISE] FreeBSD 8.1
* [CLOCK_MONOTONIC_COARSE] Linux 2.6.32
* [CLOCK_MONOTONIC_RAW] Linux 2.6.28, macOS 10.12
* [CLOCK_MONOTONIC_RAW_APPROX] macOS 10.12
* [CLOCK_BOOTTIME] Linux 2.6.39
* [CLOCK_BOOTTIME_ALARM] Linux 3.0
* [CLOCK_UPTIME] FreeBSD 7.0, OpenBSD 5.5
* [CLOCK_UPTIME_FAST] FreeBSD 8.1
* [CLOCK_UPTIME_RAW] macOS 10.12
* [CLOCK_UPTIME_RAW_APPROX] macOS 10.12
* [CLOCK_UPTIME_PRECISE] FreeBSD 8.1
* [CLOCK_SECOND] FreeBSD 8.1
Time.now
Die am häufigsten verwendete aktuelle Zeit, die als "Time.now" oder "Time # initialize" bezeichnet wird, ist auf "CLOCK_REALTIME" festgelegt, wenn clock_gettime definiert ist. Wenn nicht, verwenden Sie gettimeofday (macOS usw.).
Obwohl es nicht in Documentation geschrieben ist, schlägt rb_sys_fail intern fehl, wenn clock_gettime / gettimeofday intern fehlschlägt Machen Sie eine Ausnahme mit
.
time.clock_gettime
Seit 3.3 kann Python "clock_gettime (2)" direkt mit "time.clock_gettime (clock_id)" wie Ruby aufrufen. Was jedoch an clock_id übergeben werden kann, ist dokumentiert, und anscheinend können Konstanten wie "CLOCK_MONOTONIC_COARSE" nicht übergeben werden (ab 3.6.0). Erstens scheint Python keine API bereitzustellen, die "CLOCK_MONOTONIC_COARSE" intern verwendet oder von außen weitergibt.
In pytime.c ist die pymonotonische Funktion auf "CLOCK_MONOTONIC" festgelegt, und die pygettimeofday-Funktion wird verwendet, um "CLOCK_REALTIME" zu korrigieren. In der Pymonotonik wird "mach_absolute_time" für macOS und "CLOCK_HIGHRES" für Solaris übergeben.
time.time
Die am häufigsten verwendete Funktion "time.time ()" ruft intern die Funktion "pygetimeofday" auf, die "time.clock_gettime (CLOCK_REALTIME)" entspricht. Wie Ruby's Time.now wird gettimeofday (2) als Fallback-Ziel verwendet.
Wenn der Systemaufruf fehlschlägt, gibt er intern NULL zurück, bin mir aber nicht sicher.
pep418
Dies ist der uhrbasierte PEP-Vorschlag, der dem Zeitmodul in Python 3.3 neu hinzugefügt wurde. Https://www.python.org/dev/peps/pep-0418/
Perl5
Ist es am Hauptkörper befestigt? Das Time :: HiRes-Modul, das gerade ausgeführt wird, scheint de facto zu sein.
clock_gettime
Sie können "CLOCK_MONOTONIC" oder "CLOCK_REALTIME" an "clock_gettime" übergeben. Wie Ruby und Python wächst clock_gettime nicht, wenn es nicht auf der Betriebssystemseite definiert ist. Daher gibt es keinen Mechanismus, um auf gettimofday (2) zurückzugreifen. Derzeit wird die in der neuesten Version von macOS Sierra neu erstellte API nicht unterstützt, aber FreeBSDs "CLOCK_MONOTONIC_FAST" usw. sind als Konstanten definiert.
time
Die Zeitfunktion ruft intern gettimeofday (2) auf. Es scheint -1,0 zurückzugeben, wenn der Aufruf von gettimeofday (2) fehlschlägt. Als ich mich fragte, was dies bedeutete, fragte ich mich, ob der Fehlerstatus des Systemaufrufs als Float ausgedrückt wurde. Da es in Perl keinen direkten Summentyp, keinen direkten Produkttyp oder keine Ausnahme gibt, ist es wahrscheinlich besser, die Rückgabewerte auf gemischte Weise auszudrücken.
Es wurde nervig, also wurde es chaotisch.
C++
Schauen Sie sich std :: chrono (libstdc ++ - v3 / src / c ++ 11 / chrono.cc) in STL an.
std::chrono::system_clock::now
std::chrono::steady_clock::now
CLOCK_MONOTONIC
, wenn Sie clock_gettime (2) haben.Es ist geworden.
Go
Viele Plattformen (Linux, FreeBSD, OpenBSD) verwenden "CLOCK_REALTIME", um "now" zu implementieren, und "CLOCK_MONOTONIC", um "nanotime" für jede Architektur zu implementieren. Für NetBSD und Solaris wird "CLOCK_REALTIME" auch zur Implementierung von Nanotime verwendet, aber ich bin mir nicht sicher. Bei Plan9 bin ich mir nicht sicher.
In macOS ist die Situation kompliziert, wahrscheinlich weil es sich um eine statisch verknüpfte Binärdatei handelt. Aber ich bin mir nicht sicher. Behalten Sie nur die URL bei, auf die verwiesen wird. https://opensource.apple.com/source/xnu/xnu-1699.26.8/osfmk/i386/cpu_capabilities.h
FreeBSD sagt, dass Sie "CLOCK_MONOTONIC_FAST" verwenden können, wenn Sie die 8-STABLE-Unterstützung deaktivieren, aber Linux sagt nicht, dass Sie "CLOCK_MONOTONIC_COARSE" verwenden können, wenn Sie die Unterstützung für 2.6.32 deaktivieren.
// func now() (sec int64, nsec int32)
TEXT time·now(SB), NOSPLIT, $32
MOVL $232, AX // clock_gettime
MOVQ $0, DI // CLOCK_REALTIME
LEAQ 8(SP), SI
SYSCALL
MOVQ 8(SP), AX // sec
MOVQ 16(SP), DX // nsec
// sec is in AX, nsec in DX
MOVQ AX, sec+0(FP)
MOVL DX, nsec+8(FP)
RET
TEXT runtime·nanotime(SB), NOSPLIT, $32
MOVL $232, AX
// We can use CLOCK_MONOTONIC_FAST here when we drop
// support for FreeBSD 8-STABLE.
MOVQ $4, DI // CLOCK_MONOTONIC
LEAQ 8(SP), SI
SYSCALL
MOVQ 8(SP), AX // sec
MOVQ 16(SP), DX // nsec
// sec is in AX, nsec in DX
// return nsec in AX
IMULQ $1000000000, AX
ADDQ DX, AX
MOVQ AX, ret+0(FP)
RET
Rust
In der Standardbibliothek std :: time ist "Instant :: now" auf vielen Plattformen auf "CLOCK_MONOTONIC" und "SystemTime :: now" auf "CLOCK_REALTIME" festgelegt. Für macOS werden jeweils "mach_absolute_time" / "gettimeofday" verwendet. Aus den Kommentaren in der Ruby-Quelle geht hervor, dass "CLOCK_MONOTONIC" unter Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4 (und aus unbekannten Gründen auch mit dem aktuellen Dragonfly BSD) einwandfrei funktionieren sollte. Pannic, wenn der Systemaufruf fehlschlägt.
Instant::now
mach_absolute_time (macOS/iOS)
CLOCK_MONOTONIC (Linux/Android)
SystemTime::now
gettimeofday (macOS/iOS)
CLOCK_REALTIME (Linux/Android)
rust-coarsetime crate
Wenn Sie Geschwindigkeit über Genauigkeit wünschen, können Sie rust-coarsetime verwenden. rust-coarsetime verwendet CLOCK_MONOTONIC_COARSE
/ CLOCK_MONOTONIC_RAW_APPROX
/ CLOCK_MONOTONIC_FAST
unter Linux / OSX / FreeBSD (DragonflyBSD).
Als API für die Zeiterfassung gibt es in std.datetime der Standardbibliothek Phobos "Clock.currTime" / "Clock.currStdTime", und Sie können ClockType angeben. Beide rufen intern die currStdTime-Funktion auf. Löst eine TimeException-Ausnahme aus, wenn der Systemaufruf fehlschlägt.
Die Implementierung von currStdTime durch Angabe von ClockType für jedes Betriebssystem ist in der folgenden Tabelle zusammengefasst. Betriebssysteme, die keine neue API-Unterstützung von Sierra haben oder sich nicht in diesem Zweig befinden (z. B. OpenBSD), werden beim Kompilieren als nicht unterstütztes Betriebssystem angezeigt.
Hier stellt time (2) / gettimeofday (2) jeweils einen Systemaufruf dar, und die Konstante ist die Konstante, die an das Argument clock_gettime (2) übergeben wird.
time(2) (Linux)
time(2) (OSX)
CLOCK_SECOND (FreeBSD 8.1)
time(2) (NetBSD)
time(2) (Solaris)
CLOCK_REALTIME_COARSE (Linux 2.6.32)
gettimeofday(2) (OSX)
CLOCK_REALTIME_FAST (FreeBSD 8.1)
gettimeofday(2) (NetBSD)
CLOCK_REALTIME (Solaris)
CLOCK_REALTIME (Linux 2.5.63)
gettimeofday(2) (OSX)
CLOCK_REALTIME (FreeBSD 3.0)
gettimeofday(2) (NetBSD)
CLOCK_REALTIME (Solaris)
CLOCK_REALTIME (Linux 2.5.63)
gettimeofday(2) (OSX)
CLOCK_REALTIME_PRECISE (FreeBSD 8.1)
gettimeofday(2) (NetBSD)
CLOCK_REALTIME (Solaris)
Recommended Posts