【问题标题】:How accurate is std::chrono?std::chrono 的准确度如何?
【发布时间】:2018-01-11 16:24:35
【问题描述】:

std::chrono 宣称它可以将结果报告到纳秒级。在一台典型的 x86_64 Linux 或 Windows 机器上,人们期望它有多准确?例如,对于 10 ns、10 µs、10 ms 和 10 s 的测量,误差线是多少?

【问题讨论】:

  • 你问的是chrono 的什么时钟?
  • 这可能取决于您的硬件和操作系统。库可以支持什么和平台提供什么是两个不同的东西。
  • @DrewDormann 我不这么认为。这个问题是在询问与时钟本身的基本精度不同的概念。
  • 对于未来的读者:请注意分辨率(period())和准确性之间的重要区别。例如(一个纯粹的假设示例,不一定与 C++ 相关联)具有纳秒分辨率的时钟可能具有 0.5 纳秒精度或 3 纳秒分辨率或 500 纳秒精度。问题在于准确性。
  • 查询period是错误的。 period 提供时钟的分辨率,但不提供时钟的准确度。非常不同的概念。 steady_clock 需要产生纳秒分辨率,但不要求它以每纳秒 1 纳秒的增量向上滴答;通常,它会以明显更大的间隔向上滴答。

标签: c++ time precision chrono


【解决方案1】:

这很可能取决于硬件和操作系统。例如,当我使用 QueryPerformanceFrequency() 询问 Windows 时钟频率是多少时,我得到 3903987,如果你取其倒数,你会得到大约 256 纳秒的时钟周期或分辨率。这是我的操作系统报告的值。

根据文档,使用 std::chrono 的最小可表示持续时间是 high_resolution_clock::period::num / high_resolution_clock::period::den。

num 和 den 是分子和分母。 std::chrono::high_resolution_clock 告诉我分子是 1,分母是 10 亿,据说对应 1 纳秒:

std::cout << (double)std::chrono::high_resolution_clock::period::num /   
std::chrono::high_resolution_clock::period::den; // Results in a nanosecond.

所以根据 std::chrono 我有 1 纳秒的分辨率,但我不相信,因为本机操作系统系统调用更有可能报告更准确的频率/周期。

【讨论】:

  • 对,那么它的准确度如何?如果我这样做 auto st = std::chrono::high_resolution_clock::now(); auto en = std::chrono::high_resolution_clock::now(); std::cout &lt;&lt; std::chrono::duration_cast&lt;std::chrono::nanoseconds&gt;(en - st).count() &lt;&lt; std::endl; 我得到大约 890 ns - 基于此,我应该期望它大约 +/- 250 ns?
  • @Carbon 我问了一个类似的问题,但我仍然不知道答案。共识似乎是信任本机操作系统功能,我很确定 C++ 标准库无论如何都必须依赖它。
  • @Carbon 由于clock::now 有它自己的开销,并且因为您的系统不是实时的,所以总是会导致额外的不准确 系统,因此对 CPU 解决查询的速度的保证较少。示例:您当前的进程可能会在调用 clock::now() 之间的几微秒内被另一个进程抢占。
  • 其实分辨率和准确度是两个不同的东西。如果计算机硬件时钟偏离正确时间,然后通过 NTP 重新同步,则计算机时间在重新同步过程中必须非常不准确。我知道 C++ 标准没有给出任何保证或暗示 std::chrono 实现罩如何处理这个问题,除非时间永远不会倒退。
【解决方案2】:

准确性取决于应用程序以及此应用程序与操作系统的交互方式。我不特别熟悉chrono,但是您必须考虑到较低级别的限制。

例如,如果您使用 CPU 为网络数据包添加时间戳,则测量精度会非常嘈杂。即使时间测量的精度可能是 1 纳秒,与数据包到达相对应的中断的上下文切换时间也可能约为 1 微秒。您可以准确测量应用程序何时处理数据包,但不能准确测量数据包到达的时间。

【讨论】:

    【解决方案3】:

    简答:以微秒及以下为单位不准确。##

    长答案: 我很想知道我的两个 dp 程序需要多少时间来执行。所以我使用了chrono lib,但是当我运行它时它显示0微秒。所以从技术上讲,我无法比较。我无法增加数组大小,因为无法将其扩展到 1e8。 所以我写了一个排序程序来测试它并运行它 100,结果如下: enter image description here

    很明显,对于相同的输入它是不一致的,所以我建议不要使用更高的精度。

    【讨论】:

    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2014-03-23
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多