Каково использование std::chrono::high_resolution_clock?

Сначала я подумал, что его можно использовать для измерения производительности. Но говорят, что std::chrono::high_resolution_clock может быть нестабильным (is_steady может быть false). Также говорят, что std::chrono::high_resolution_clock может даже быть псевдонимом std::chrono::system_clock, что обычно не является постоянным. Таким образом, я не могу измерять временные интервалы часами этого типа, потому что в любой момент часы могут быть скорректированы, и мои измерения будут неправильными.

В то же время я не могу преобразовать временные точки std::chrono::high_resolution_clock в календарное время, потому что у него нет метода to_time_t. Так что я не могу получить реальное время с часами этого типа.

Тогда для чего можно использовать std::chrono::high_resolution_clock?


person anton_rh    schedule 25.05.2016    source источник
comment
Ну, поскольку это может быть псевдоним, он не может быть постоянным, поскольку system_clock не является постоянным, как вы указываете. Это дополнительные часы, вот и все. Если реализация не может его поддерживать, вы получаете system_clock вместо него. Но, если вам повезет, вы получите элегантные, блестящие часы с высоким разрешением.   -  person Sam Varshavchik    schedule 25.05.2016
comment
google.com/   -  person Ken White    schedule 25.05.2016
comment
@Ken White: Первые ответы, которые я получаю по вашей ссылке, не имеют ничего общего с std::chrono::high_resolution_clock.   -  person MikeMB    schedule 25.05.2016
comment
@KenWhite почти каждый результат, на который вы ссылаетесь, не имеет ничего общего с классом C ++, заданным в этом вопросе.   -  person johnbakers    schedule 25.05.2016


Ответы (2)


Их нет.

Извините, мне плохо.

Если вам хочется использовать high_resolution_clock, выберите вместо этого steady_clock. В libc++ и VS high_resolution_clock в любом случае является псевдонимом типа steady_clock.

В gcc high_resolution_clock является псевдонимом типа system_clock, и я видел более одного использования high_resolution_clock::to_time_t на этой платформе (что неверно).

Используйте <chrono>. Но есть части <chrono>, которых вам следует избегать.

  • Не используйте high_resolution_clock.
  • Избегайте использования .count() и .time_since_epoch(), если нет другого способа выполнить работу.
  • Избегайте duration_cast, если только код не будет компилироваться без него, и вы хотите, чтобы поведение было усечено до нуля.
  • Избегайте явного синтаксиса преобразования, если компилируется неявное преобразование.
person Howard Hinnant    schedule 25.05.2016
comment
Спасибо за ваш ответ. Я думаю, что high_resolution_clock все еще можно законно использовать таким образом: typedef typename std::conditional<std::chrono::high_resolution_clock::is_steady, std::chrono::high_resolution_clock, std::chrono::steady_clock>::type hr_steady_clock;. - person anton_rh; 26.05.2016
comment
@anton_rh: Совершенно верно. Для каждой реализации, о которой я знаю, это сложный способ сказать using hr_steady_clock = std::chrono::steady_clock;. - person Howard Hinnant; 26.05.2016
comment
Не могли бы вы подробнее рассказать о части «Избегайте использования .count() и .time_since_epoch()»? Какие предостережения скрываются за этими функциями? - person Julien; 17.10.2018
comment
@Julien: .count() и .time_since_epoch() очень похожи на reinterpret_cast. Они меняют тип настолько радикально, что меняется смысл значения. Иногда это необходимо. Но если вы можете избежать этого, chrono будет обнаруживать больше логических ошибок во время компиляции, убедившись, что вы используете единицы времени последовательно. - person Howard Hinnant; 17.10.2018

Я бы предположил, что единственное использование часов высокого разрешения может лежать.

Если ваш алгоритм использует много измерений, любая ошибка должна быть усреднена, и вы сможете измерять очень маленькие интервалы.

Я использовал часы с высоким разрешением для построения временных шкал сетевых событий, где в противном случае все мои интервалы были бы 0. :)

Наконец, учтите, что, хотя ваши системные часы могут быть нестабильными, если ваши часы высокого разрешения стабильны, это значительно упрощает некоторые игры, в которые вы должны играть, чтобы убедиться, что время всегда течет вперед.

Подводя итог, да, он может дать сбой, но когда он у вас есть, он очень полезен. Множество образцов — ваши друзья. :)

person Sam    schedule 25.05.2016