【问题标题】:What is the best, most accurate timer in C++?C++ 中最好、最准确的计时器是什么?
【发布时间】:2011-04-02 04:26:10
【问题描述】:

什么是 C++ 中最好、最准确的计时器?

【问题讨论】:

  • 绝对最好的计时器可能是在某些与原子钟相连的嵌入式设备上运行的实时操作系统上的某些系统特定调用。这是您正在寻找的,还是您愿意接受比“最好、最准确的计时器”稍逊一筹的东西?
  • @James 沿着电线移动所花费的时间,以及被处理/等也被考虑在内了吗? (那句话没有任何意义……)
  • 另外,如此高分辨率的计时器可能会占用 CPU。

标签: c++ timer


【解决方案1】:

在 C++11 中,您可以通过以下方式轻松获得最高分辨率的计时器:

#include <iostream>
#include <chrono>
#include "chrono_io"

int main()
{
    typedef std::chrono::high_resolution_clock Clock;
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << t2-t1 << '\n';
}

示例输出:

74 nanoseconds

“chrono_io”是缓解这些新类型的 I/O 问题的扩展,可免费使用here

在 boost 中还有一个&lt;chrono&gt; 的实现(可能仍在主干上,不确定它是否已发布)。

【讨论】:

  • 我尝试运行 now() 函数 3 亿次,大约有 100 次 t1 和 t2 的延迟/差异大于 10 微秒。是因为上下文切换还是其他原因?谢谢
  • @user1687035:上下文切换可能是罪魁祸首。这取决于什么平台,哪个编译器(甚至是编译器版本),机器上还有哪些其他进程等。通用计算机不是一个很好的时钟,除非它不断地询问其他计算机现在是什么时间。 ;-) 在 macOS 上,我得到了相当稳定的计时除非时间机器正在备份,聚光灯正在索引,或者邮件正在获取。
【解决方案2】:

这个问题的答案是特定于平台的。操作系统负责跟踪时间,因此,C++ 语言本身没有为此提供任何语言结构或内置函数。

但是,这里有一些平台相关计时器的资源:

跨平台解决方案可能是boost::asio::deadline_timer

【讨论】:

  • 回答不是基于时间的关键应用程序
【解决方案3】:

在 windows 下它会是 QueryPerformanceCounter,尽管您没有指定任何条件,但可能有一个外部超高分辨率计时器,该计时器具有驱动程序的 c++ 接口

【讨论】:

  • std::chrono::high_resolution_clock 和 QueryPerformanceCounter 给出相同的结果,分辨率均为 0.1 微秒。而且每次运行都给出了非常不同的结果!
【解决方案4】:

C++ 标准并没有详细说明时间。通过 &lt;ctime&gt; 标头从 C 继承了一些特性。

函数clock是获得亚秒级精度的唯一方法,但精度可能低至一秒(由宏CLOCKS_PER_SEC定义)。此外,它根本不测量实时,而是测量处理器时间。

函数time 测量实时,但(通常)仅精确到秒。

要以亚秒级精度测量实时,您需要一个非标准库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多