[PYTHON] Sprechen Sie über die Zeiterfassungs-API in der Programmiersprache

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 .

Python3 (3.3 oder höher)

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

  1. Verwenden Sie "CLOCK_REALTIME", wenn Sie clock_gettime (2) haben.
  2. Wenn nicht, benutze gettimeofday (2)
  3. Wenn nicht, benutze Zeit (2)

std::chrono::steady_clock::now

  1. Verwenden Sie CLOCK_MONOTONIC, wenn Sie clock_gettime (2) haben.
  2. Wenn nicht, verwenden Sie std :: chrono :: system_clock, um den Unterschied zu ermitteln

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

SystemTime::now

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).

D Sprache

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.

Recommended Posts

Sprechen Sie über die Zeiterfassungs-API in der Programmiersprache
10 beliebtesten Programmiersprachen im Jahr 2020
Die Popularität von Programmiersprachen
Programmieren, um in der Welt zu kämpfen ~ 5-1
Programmieren, um in der Welt zu kämpfen 5-3
Abrufen der arXiv-API in Python
Aktivitätsprotokoll im Programmierkreis
Die Geschichte der Teilnahme an AtCoder
Programmierung für den Kampf in der Welt - Kapitel 4
Die Geschichte des "Lochs" in der Akte
Greifen Sie mit Python auf die Twitter-API zu
Code-Tests rund um die Uhr in Python
Programmieren, um in der Welt zu kämpfen ~ 5-2
Wenn Sie neu in der Programmierung sind, warum machen Sie nicht vorerst ein "Spiel"? Die Geschichte
Trends in Programmiersprachen aus Sicht von GitHub (aktualisierte halbjährliche Änderungen)
Die gefragteste Programmiersprache im Jahr 2020
Versuchen Sie es mit der Wunderlist-API in Python
Die Geschichte eines Fehlers in PyOCR
Versuchen Sie, die Kraken-API mit Python zu verwenden
Tweet mit der Twitter-API in Python
MongoDB mit Python zum ersten Mal
RICOH THETA S API in mehreren Sprachen.
Zeichnen Sie Grafiken in der Programmiersprache Julia
Versuchen Sie, die Spotify-API in Django zu aktivieren.
Schreiben Sie Klassen (oder klassenähnliche) in verschiedenen Programmiersprachen
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Übergangsanimation der beliebtesten Programmiersprache (#Programmiersprache #popular)
Ich habe zum ersten Mal versucht, Python zu programmieren.
Tipps zum Erreichen der ATND-API mit Python
Die Geschichte, das optimale n in N Faust zu finden
Die Geschichte des Lesens von HSPICE-Daten in Python
Schleifen Sie gleichzeitig Variablen in der Vorlage
Die Geschichte der Anzeige von Mediendateien in Django
Klicken Sie in Python auf die Firebase Dynamic Links API
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Die Geschichte, die zur Installation von Pip passt