В чем разница между std::system_clock
и std::steady_clock
? (Примерный случай, иллюстрирующий разные результаты / поведение, был бы отличным).
Если моя цель - точно измерить время выполнения функций (например, эталонный тест), что будет лучшим выбором между std::system_clock
, std::steady_clock
и std::high_resolution_clock
?
system_clock
Windows они не работают . В Windows системное время может быть изменено на любое произвольное значение любым достаточно привилегированным пользователем. Кроме того, служба синхронизации времени может при необходимости корректировать системное время назад. Я ожидаю, что большинство других платформ имеют аналогичные функции, позволяющие регулировать системное время.Ответы:
С 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:
Например, на общесистемные часы может влиять что-то вроде перехода на летнее время, когда фактическое время, указанное в какой-то момент в будущем, может фактически быть временем в прошлом. (Например, в США осеннее время сдвигается на один час назад, поэтому один и тот же час переживается "дважды") Однако
steady_clock
такие вещи не могут повлиять на это.Другой способ думать о «стабильном» в этом случае - это требования, определенные в таблице 20.11.3 [time.clock.req] / 2:
Это все, что в стандарте говорится об их различиях.
Если вы хотите провести сравнительный анализ, вам, вероятно, будет лучше всего
std::high_resolution_clock
, потому что вполне вероятно, что ваша платформа использует таймер высокого разрешения (например,QueryPerformanceCounter
в Windows) для этих часов. Однако, если вы проводите тестирование, вам действительно следует подумать об использовании таймеров для конкретной платформы для вашего теста, потому что разные платформы обрабатывают это по-разному. Например, некоторые платформы могут предоставить вам некоторые средства определения фактического количества тактов часов, которое требуется программе (независимо от других процессов, работающих на том же процессоре). А еще лучше, возьмите в руки настоящий профилировщик и используйте его.источник
steady_clock
иsystem_clock
здесь.system_clock
было UTC.Билли дал отличный ответ на основе стандарта ISO C ++, с которым я полностью согласен. Однако есть и другая сторона истории - реальная жизнь. Кажется, что сейчас действительно нет разницы между этими часами в реализации популярных компиляторов:
gcc 4.8:
Visual Studio 2012:
В случае gcc вы можете проверить, имеете ли вы дело с постоянными часами, просто проверив
is_steady
и действуя соответствующим образом. Однако VS2012, похоже, здесь немного обманывает :-)Если вам нужны часы с высокой точностью, я рекомендую сейчас написать свои собственные часы, которые соответствуют официальному интерфейсу часов C ++ 11, и дождаться, пока реализации наверстают упущенное. Это будет намного лучше, чем использование API для конкретной ОС непосредственно в вашем коде. Для Windows это можно сделать так:
Для Linux это еще проще. Просто прочтите страницу руководства
clock_gettime
и измените приведенный выше код.источник
Реализация GCC 5.3.0
C ++ stdlib находится внутри источника GCC:
high_resolution_clock
это псевдоним дляsystem_clock
system_clock
пересылает на первое из следующих доступных:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
пересылает на первое из следующих доступных:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Затем объясняется
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Разница между CLOCK_REALTIME и CLOCK_MONOTONIC?источник
Пожалуй, самое существенное отличие состоит в том, что отправной точкой
std::chrono:system_clock
является 1.1.1970, так называемая UNIX-эпоха. С другой стороны,std::chrono::steady_clock
обычно это время загрузки вашего ПК, и это лучше всего подходит для измерения интервалов.источник