Was ist der Unterschied zwischen std::system_clock
und std::steady_clock
? (Ein Beispielfall, der unterschiedliche Ergebnisse / Verhaltensweisen veranschaulicht, wäre großartig).
Wenn mein Ziel genau zu Ausführungszeit von Funktionen (wie ein Benchmark) zu messen, was wäre die beste Wahl zwischen std::system_clock
, std::steady_clock
und std::high_resolution_clock
?
system_clock
ist unter Windows nicht stabil. Unter Windows kann die Systemzeit von jedem ausreichend privilegierten Benutzer auf einen beliebigen Wert geändert werden. Darüber hinaus kann der Zeitsynchronisationsdienst die Systemzeit bei Bedarf rückwärts anpassen. Ich gehe davon aus, dass die meisten anderen Plattformen ähnliche Funktionen haben, mit denen die Systemzeit angepasst werden kann.Antworten:
Von N3376:
20.11.7.1 [time.clock.system] / 1:
20.11.7.2 [time.clock.steady] / 1:
20.11.7.3 [time.clock.hires] / 1:
Beispielsweise kann die systemweite Uhr von einer Sommerzeit beeinflusst werden. Zu diesem Zeitpunkt kann die zu einem späteren Zeitpunkt angegebene tatsächliche Zeit tatsächlich eine Zeit in der Vergangenheit sein. (ZB in den USA bewegt sich die Herbstzeit um eine Stunde zurück, so dass dieselbe Stunde "zweimal" erlebt wird.) Es
steady_clock
ist jedoch nicht gestattet, von solchen Dingen betroffen zu sein.Eine andere Art, in diesem Fall über "stetig" nachzudenken, sind die Anforderungen, die in der Tabelle vom 20.11.3 [time.clock.req] / 2 definiert sind:
Das ist alles, was der Standard über ihre Unterschiede hat.
Wenn Sie Benchmarking durchführen möchten, ist dies wahrscheinlich die beste Wahl
std::high_resolution_clock
, da Ihre Plattform wahrscheinlich einen hochauflösenden Timer (z. B.QueryPerformanceCounter
unter Windows) für diese Uhr verwendet. Wenn Sie jedoch ein Benchmarking durchführen, sollten Sie wirklich in Betracht ziehen, plattformspezifische Timer für Ihren Benchmark zu verwenden, da verschiedene Plattformen dies unterschiedlich handhaben. Auf einigen Plattformen können Sie beispielsweise die tatsächliche Anzahl der für das Programm erforderlichen Takt-Ticks ermitteln (unabhängig von anderen Prozessen, die auf derselben CPU ausgeführt werden). Besser noch, besorgen Sie sich einen echten Profiler und nutzen Sie diesen.quelle
steady_clock
undsystem_clock
hier.system_clock
UTC.Billy gab eine großartige Antwort basierend auf dem ISO C ++ - Standard, dem ich voll und ganz zustimme. Es gibt jedoch eine andere Seite der Geschichte - das wirkliche Leben. Es scheint, dass es im Moment wirklich keinen Unterschied zwischen diesen Uhren bei der Implementierung populärer Compiler gibt:
gcc 4.8:
Visual Studio 2012:
Im Falle von gcc können Sie überprüfen, ob Sie mit einer stabilen Uhr umgehen, indem Sie einfach prüfen
is_steady
und sich entsprechend verhalten. Allerdings scheint VS2012 hier ein bisschen zu schummeln :-)Wenn Sie eine hochpräzise Uhr benötigen, empfehle ich Ihnen, zunächst eine eigene Uhr zu schreiben, die der offiziellen C ++ 11-Uhrschnittstelle entspricht, und zu warten, bis die Implementierungen aufholen. Dies ist ein viel besserer Ansatz als die Verwendung einer betriebssystemspezifischen API direkt in Ihrem Code. Für Windows können Sie dies folgendermaßen tun:
Für Linux ist es noch einfacher. Lesen Sie einfach die Manpage von
clock_gettime
und ändern Sie den obigen Code.quelle
Implementierung von GCC 5.3.0
C ++ stdlib befindet sich in der GCC-Quelle:
high_resolution_clock
ist ein Alias fürsystem_clock
system_clock
leitet an die erste der folgenden Optionen weiter, die verfügbar sind:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
leitet an die erste der folgenden Optionen weiter, die verfügbar sind:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Dann wird
CLOCK_REALTIME
vsCLOCK_MONOTONIC
erklärt unter: Unterschied zwischen CLOCK_REALTIME und CLOCK_MONOTONIC?quelle
Der vielleicht bedeutendste Unterschied ist die Tatsache, dass der Ausgangspunkt
std::chrono:system_clock
der 1.1.1970, der sogenannten UNIX-Epoche, ist. Auf der anderen Seite ist diesstd::chrono::steady_clock
normalerweise die Startzeit Ihres PCs und eignet sich am besten zum Messen von Intervallen.quelle