std::chrono::high_resolution_clock有哪些用途?

29
起初我认为它可以用于性能测量。但是saidstd::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可以用来做什么?

2
好的,既然可能是一个别名,它就不可能是稳定的,正如你所指出的那样,system_clock 不是稳定的。它只是一个可选的时钟而已。如果实现不支持它,你就会得到它的替代品 system_clock。但是,如果你很幸运的话,你就会得到一个漂亮、闪亮、高分辨率的时钟。 - Sam Varshavchik
1
@Ken White:我从你的链接中得到的第一个答案与std::chrono::high_resolution_clock毫无关系。 - MikeMB
1
@KenWhite,你链接的几乎每个结果都与此问题中所要求的C++类无关。 - johnbakers
2个回答

42

没有。

抱歉,我的错。

如果你想使用high_resolution_clock,请选择steady_clock。在libc++和VS上,high_resolution_clock实际上是steady_clock的类型别名。

在gcc上,high_resolution_clocksystem_clock的类型别名,并且我见过一些在此平台上使用high_resolution_clock::to_time_t的情况(这是错误的)。

使用<chrono>。但是,有些<chrono>部分应该避免使用。

  • 不要使用high_resolution_clock
  • 除非没有其他方法来完成工作,否则避免使用.count().time_since_epoch()
  • 除非代码无法编译,且您希望截断为零的行为,否则避免使用duration_cast
  • 如果隐式转换可以编译,请避免使用显式转换语法。

3
可以详细说明一下“避免使用.count().time_since_epoch()”这部分吗?这些函数背后隐藏着哪些注意事项? - Julien
5
.count().time_since_epoch()有点像reinterpret_cast,它们改变类型的方式非常剧烈以至于改变了值的含义。有时候这是必要的。但是如果你能避免使用它们,通过确保你对时间单位的使用一致性,chrono会在编译时更多地捕获逻辑错误。 - Howard Hinnant
4
是的。随着我们向C++20过渡,.count()应该会变得不那么必要了。例如,您将能够在不使用.count()的情况下打印出持续时间。 - Howard Hinnant
5
我在计时预期较短的情况下使用steady_clock,否则使用system_clock。"较短"是一个模糊的术语。可以称之为1秒或1分钟。我确实使用duration。但是,只有在需要截断向零行为时才使用duration_cast。不要使用duration_cast将秒转换为毫秒(例如)。隐式转换对此效果很好。使用duration_cast将毫秒转换为秒。除非需要打印语句,否则不要使用.count()。即使如此,我更喜欢C++20或https://github.com/HowardHinnant/date/blob/master/include/date/date.h。 - Howard Hinnant
3
Chrono视频1小时教程:https://www.youtube.com/watch?v=P32hvk8b13M - Howard Hinnant
显示剩余5条评论

4

我建议高分辨率时钟的单次使用可能存在误差。

如果您的算法使用了多个测量值,那么任何误差都应该平均化,您应该能够测量非常小的时间间隔。

我曾经使用高分辨率时钟构建网络事件的时间轴,在其他情况下我的时间间隔都是 0。 :)

最后,请考虑一下,尽管您的系统时钟可能不稳定,但如果您的高分辨率时钟是稳定的,这将极大地简化一些必须进行的操作,以确保时间始终向前流动。

总之,是的,它可能会失败,但当您拥有它时,它非常有用。 大量样本是您的朋友。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接