Grundlegendes zu time.perf_counter () und time.process_time ()

75

Ich habe einige Fragen zu den neuen Funktionen time.perf_counter()und time.process_time().

Für die erstere aus der Dokumentation:

Gibt den Wert (in Sekundenbruchteilen) eines Leistungsindikators zurück, dh eine Uhr mit der höchsten verfügbaren Auflösung , um eine kurze Dauer zu messen. Es enthält die im Schlaf verstrichene Zeit und ist systemweit. Der Referenzpunkt des zurückgegebenen Werts ist undefiniert, sodass nur die Differenz zwischen den Ergebnissen aufeinanderfolgender Aufrufe gültig ist.

Ist diese "höchste Auflösung" auf allen Systemen gleich? Oder hängt es immer etwas davon ab, ob wir zum Beispiel Linux oder Windows verwenden?
Die Frage ergibt sich aus der Tatsache time.time(), dass in der Dokumentation steht, dass "nicht alle Systeme Zeit mit einer besseren Genauigkeit als 1 Sekunde liefern". Wie können sie jetzt eine bessere und höhere Auflösung bieten?

Über letzteres time.process_time():

Gibt den Wert (in Bruchteilen von Sekunden) der Summe der System- und Benutzer-CPU-Zeit des aktuellen Prozesses zurück. Die im Schlaf verstrichene Zeit ist nicht enthalten. Es ist per Definition prozessweit. Der Referenzpunkt des zurückgegebenen Werts ist undefiniert, sodass nur die Differenz zwischen den Ergebnissen aufeinanderfolgender Aufrufe gültig ist.

Ich verstehe nicht, was sind diese "Systemzeit" und "Benutzer-CPU-Zeit"? Was ist der Unterschied?

zer0uno
quelle
Es ist mehr duckZeit als Funktion zu verwenden, anstatt sie zu implementieren. Dh verwenden time.time()oder time.monotonic()je nachdem, was Sie wollen.
Dima Tisnek
3
In diesem Kommentar erfahren Sie, wie alle von einem Prozess verwendeten Kerne in time.clockund summiert werden time.process_time, untergeordnete Prozesse jedoch nicht. Siehe auch diese Diskussion über Präzision (variiert natürlich je nach System).
Max

Antworten:

96

In diesem Zusammenhang gibt es zwei verschiedene Arten von "Zeit": absolute Zeit und relative Zeit.

Absolute Zeit ist die "reale Zeit", die von zurückgegeben wird time.time()und mit der wir alle zu tun haben. Sie wird normalerweise ab einem festgelegten Zeitpunkt in der Vergangenheit (z. B. der UNIX-Epoche von 00:00:00 UTC am 01.01.1970) mit einer Auflösung von mindestens 1 Sekunde gemessen. Moderne Systeme bieten normalerweise eine Auflösung von Milli- oder Mikrosekunden. Es wird von der dedizierten Hardware auf den meisten Computern gewartet. Die RTC-Schaltung (Real-Time Clock) ist normalerweise batteriebetrieben, sodass das System die Echtzeit zwischen den Einschaltungen verfolgt. Diese "Echtzeit" unterliegt auch Änderungen, die auf Ihrem Standort (Zeitzonen) und Ihrer Jahreszeit (Sommerzeit) basieren oder als Offset von UTC (auch als GMT- oder Zulu-Zeit bezeichnet) ausgedrückt werden.

Zweitens gibt es eine relative Zeit, die von time.perf_counterund zurückgegeben wird time.process_time. Diese Art von Zeit hat keine definierte Beziehung zur realen Zeit in dem Sinne, dass die Beziehung system- und implementierungsspezifisch ist. Es kann nur zum Messen von Zeitintervallen verwendet werden, dh eines Wertes ohne Einheit, der proportional zu der zwischen zwei Zeitpunkten verstrichenen Zeit ist. Dies wird hauptsächlich verwendet, um die relative Leistung zu bewerten (z. B. ob diese Codeversion schneller als diese Codeversion ausgeführt wird).

Auf modernen Systemen wird es unter Verwendung eines CPU-Zählers gemessen, der bei einer Frequenz, die sich auf den Hardware-Takt der CPU bezieht, monoton erhöht wird. Die Zählerauflösung hängt stark von der Hardware des Systems ab. Der Wert kann in den meisten Fällen nicht zuverlässig mit der Echtzeit in Beziehung gesetzt oder sogar zwischen Systemen verglichen werden. Darüber hinaus wird der Zählerwert jedes Mal zurückgesetzt, wenn die CPU eingeschaltet oder zurückgesetzt wird.

time.perf_counterGibt den absoluten Wert des Zählers zurück. time.process_timeist ein Wert, der vom CPU-Zähler abgeleitet, aber nur aktualisiert wird, wenn ein bestimmter Prozess auf der CPU ausgeführt wird, und in "Benutzerzeit", dh die Zeit, in der der Prozess selbst auf der CPU ausgeführt wird, und "System" unterteilt werden kann time ', dies ist die Zeit, zu der der Betriebssystemkernel im Auftrag des Prozesses auf der CPU ausgeführt wird.

isedev
quelle
In modernen Computern -> zwei Uhren (dh zwei unabhängige Schaltkreise) verwaltet einer nur die Echtzeit, ein anderer die Arbeit der CPU, stimmt das? Warum diese Aufteilung? Ich meine, könnte es nicht nur eine Uhr geben, wenn man davon ausgeht, dass beispielsweise 100 Treffer Hardware-Clock = 1 Sekunde sind?
zer0uno
2
Echtzeit läuft mit einer festen Rate, CPU-Takte variieren stark. Die Verwendung des CPU-Takts zur Messung der Codeleistung bietet die bestmögliche Auflösung (bis zur Befehlsskala). Die Beschränkung des CPU-Takts auf eine feste Unterteilung von Echtzeit schränkt diese Genauigkeit sinnlos ein.
Isedev
Ich spreche nicht von Begrenzung, ich sage, um die Echtzeit vom CPU-Zähler abzuleiten. Ich meine, wenn ich einen 2-GHz-Prozessor habe, erhöhe ich jedes Mal, wenn 2 Millionen Schwingungen erzeugt werden, die Zeit einer Sekunde
zer0uno
3
Wie würde das Betriebssystem über die CPU-Frequenz Bescheid wissen? über CPU-Low-Power-Zustände? Wer glaubt an Multi-Core-Systeme? Und was passiert, wenn die CPU ausgeschaltet ist? Es ist eine so schwierige Aufgabe, sie zu verwalten, wenn eine dedizierte Echtzeit-Taktschaltung mit Batteriestrom so einfach ist.
Isedev
@antox: zum besseren Verständnis lesen Sie dies
jfs