【发布时间】:2021-04-23 16:20:21
【问题描述】:
多年来,我一直在为帧计时器使用以下时钟定义:
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做什么? -
这是一个帧计时器。因此,它用于必须将处理划分为帧的应用程序。例如,所有处理必须适合 3600 fps 帧的嵌入式实时应用程序,或在 60 fps 时更宽容的视频游戏。我也经常使用
std::chrono::high_resolution_clock进行基准测试,不过,我通常不太关心它在这些应用程序中是否稳定,因为我可以一遍又一遍地运行基准测试。 -
在那些专用系统上,系统时钟多久更改一次?你做UTC闰秒吗?你启用了 dst 吗?
-
@YSC 有时我看到处理器标量或其他频率控制参数发生变化以帮助支持特定波特率或 ODR 的实现。我们没有使用 GHz 时钟速度来最大程度地减少错误,因此错误变得非常重要,而且我们处于安全关键型应用中。当我们遇到这个问题时,我们当然必须更新我们的系统时钟以解决处理器频率的差异并保持我们的帧时间不变。对于 GNSS 应用,我们确实会考虑闰秒。
-
那可能还不错,是的。此外,这些更改可能导致的错误类型特别难以追踪,这无济于事。
标签: c++ chrono high-resolution-clock