【问题标题】:What are the uses of std::chrono::high_resolution_clock?std::chrono::high_resolution_clock 的用途是什么?
【发布时间】:2016-09-22 10:47:31
【问题描述】:

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

【问题讨论】:

  • 好吧,因为它可能是一个别名,所以它不能稳定,因为system_clock 不稳定,正如你所指出的。这是一个可选的时钟,就是这样。如果实现不支持它,您可以使用system_clock 代替它。但是,如果你幸运的话,你会得到一个漂亮、闪亮、高分辨率的时钟。
  • @Ken White:我从您的链接中得到的第一个答案与 std::chrono::high_resolution_clock 无关。
  • @KenWhite 几乎你链接到的每个结果都与这个问题中提出的 C++ 类无关

标签: c++ c++11 time clock chrono


【解决方案1】:

没有。

对不起,my bad

如果您想使用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,除非没有它代码无法编译,并且您希望截断为零的行为。
  • 如果隐式转换编译,请避免显式转换语法。

【讨论】:

  • 感谢您的回答。我认为 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;.
  • @anton_rh:确实如此。对于我所知道的每个实现,这是一种复杂的说法 using hr_steady_clock = std::chrono::steady_clock;
  • 您能否详细说明“避免使用.count().time_since_epoch()”部分?这些功能背后隐藏着哪些注意事项?
  • @Julien: .count().time_since_epoch() 很像 reinterpret_cast。它们改变了类型,以至于改变了值的含义。有时这是必要的。但如果你能避免它,chrono 会在编译时为你捕获更多的逻辑错误,确保你使用的时间单位是一致的。
【解决方案2】:

我建议单独使用高分辨率时钟可能

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

我已使用高分辨率时钟在网络事件中构建时间线,否则我的时间间隔将全部为 0。 :)

最后,考虑到虽然您的系统时钟可能不稳定,如果您的高分辨率时钟是稳定的,这大大简化了您必须玩的一些游戏,以确保时间总是向前流动。 p>

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

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2014-03-23
    • 1970-01-01
    • 2015-05-14
    • 2017-08-31
    • 1970-01-01
    • 2015-06-04
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多