С N3376:
20.11.7.1 [time.clock.system] / 1:
Объекты класса system_clock
представляют время настенных часов из общесистемных часов реального времени.
20.11.7.2 [time.clock.steady] / 1:
Объекты класса steady_clock
представляют собой часы, для которых значения time_point
никогда не уменьшаются по мере продвижения физического времени и для которых значения time_point
продвигаются с постоянной скоростью относительно реального времени. То есть часы можно не настраивать.
20.11.7.3 [time.clock.hires] / 1:
Объекты класса high_resolution_clock
представляют собой часы с наименьшим периодом тика. high_resolution_clock
может быть синонимом system_clock
или steady_clock
.
Например, на общесистемные часы может влиять что-то вроде перехода на летнее время, когда фактическое время, указанное в какой-то момент в будущем, может фактически быть временем в прошлом. (Например, в США осеннее время сдвигается на один час назад, поэтому один и тот же час переживается "дважды") Однако steady_clock
такие вещи не могут повлиять на это.
Другой способ думать о «стабильном» в этом случае - это требования, определенные в таблице 20.11.3 [time.clock.req] / 2:
В Таблице 59 C1
и C2
обозначены типы часов. t1
и t2
являются значениями, возвращаемыми тем C1::now()
местом, где t1
происходит возврат вызова до возврата вызова, t2
и оба этих вызова происходят раньше C1::time_point::max()
. [Примечание: это означает C1
отсутствие перехода между t1
и t2
. - конец примечания]
Выражение: C1::is_steady
Возвращает: const bool
Операционная семантика: true
if t1 <= t2
всегда истинно, а время между тактами часов постоянно, в противном случае false
.
Это все, что в стандарте говорится об их различиях.
Если вы хотите провести сравнительный анализ, вам, вероятно, будет лучше всего std::high_resolution_clock
, потому что вполне вероятно, что ваша платформа использует таймер высокого разрешения (например, QueryPerformanceCounter
в Windows) для этих часов. Однако, если вы проводите тестирование, вам действительно следует подумать об использовании таймеров для конкретной платформы для вашего теста, потому что разные платформы обрабатывают это по-разному. Например, некоторые платформы могут предоставить вам некоторые средства определения фактического количества тактов часов, которое требуется программе (независимо от других процессов, работающих на том же процессоре). А еще лучше, возьмите в руки настоящий профилировщик и используйте его.