Я уже много лет использую следующее определение часов для таймера кадра:
using frame_clock = std::conditional_t<
std::chrono::high_resolution_clock::is_steady,
std::chrono::high_resolution_clock,
std::chrono::steady_clock>;
Другими словами, мне нужны часы, определяемые с максимально возможным разрешением, но они должны увеличиваться монотонно. Обратите внимание, что MSVC в настоящее время использует следующий псевдоним для определения std::chrono::high_resolution_clock
:
using high_resolution_clock = steady_clock;
Поэтому в MSVC определенный мной псевдоним будет просто использовать std::chrono::steady_clock
. Это не обязательно верно для libstdc++ и libc++, отсюда и использование псевдонима.
Недавно я наткнулся здесь на сноску: https://en.cppreference.com/w/cpp/chrono/high_resolution_clock
Обратите внимание, что cppreference явно не рекомендует использовать std::chrono::high_resolution_clock
. Их обоснование заключалось в том, что часы различаются в зависимости от реализации... но разве это не верно и для std::chrono::steady_clock
и std::chrono::system_clock
? Например, я не смог найти ничего, что гарантировало бы, что периоды часов между часами должны быть в определенных единицах. На самом деле, я понимаю, что это преднамеренно.
Мой вопрос в том, что после стольких лет использования std::chrono::high_resolution_clock
(для таймеров кадров и тестов), должен ли я беспокоиться больше, чем сейчас? Даже здесь, на этом сайте, я вижу много рекомендаций по использованию std::chrono::high_resolution_clock
, несмотря на то, что говорится в этой сноске. Любое дальнейшее понимание этого несоответствия или примеры того, где это может вызвать проблемы, будут высоко оценены.
frame_clock
? - person YSC   schedule 23.04.2021std::chrono::high_resolution_clock
для бенчмарков, хотя меня часто не волнует, стабилен ли он в этих приложениях, поскольку я могу просто запускать бенчмарки снова и снова. - person Christopher Mauer   schedule 23.04.2021