Von N3376:
20.11.7.1 [time.clock.system] / 1:
Klassenobjekte system_clock
repräsentieren die Wanduhrzeit von der systemweiten Echtzeituhr.
20.11.7.2 [time.clock.steady] / 1:
Klassenobjekte steady_clock
stellen Uhren dar, für die die Werte von time_point
niemals mit fortschreitender physikalischer Zeit abnehmen und für die Werte von time_point
fortschreitender Geschwindigkeit relativ zur Echtzeit. Das heißt, die Uhr kann möglicherweise nicht eingestellt werden.
20.11.7.3 [time.clock.hires] / 1:
Klassenobjekte high_resolution_clock
repräsentieren Uhren mit der kürzesten Tick-Periode. high_resolution_clock
kann ein Synonym für system_clock
oder sein steady_clock
.
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:
In Tabelle 59 C1
und C2
bezeichnen Uhrentypen. t1
und t2
sind Werte, die zurückgegeben werden, C1::now()
wenn die Rückgabe des Anrufs t1
vor der Rückgabe des Anrufs erfolgt t2
und diese beiden Anrufe zuvor erfolgen C1::time_point::max()
. [Hinweis: Dies bedeutet, C1
dass nicht zwischen t1
und umbrochen wurde t2
. - Endnote]
Ausdruck: C1::is_steady
Rückgabe: const bool
Operative Semantik: true
Wenn dies t1 <= t2
immer der Fall ist und die Zeit zwischen den Ticks der Uhr konstant ist, ist dies ansonsten konstant false
.
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.