【问题标题】:Measuring time with a resolution of microseconds in C++?在 C++ 中以微秒的分辨率测量时间?
【发布时间】:2015-08-07 21:46:25
【问题描述】:

我正在寻找一种在 C++/Windows 中测量微秒的方法。

我读到了“时钟”功能,但它只返回毫秒...
有没有办法做到这一点?

【问题讨论】:

    标签: c++ windows timing


    【解决方案1】:

    在 Windows 上使用 QueryPerformanceCounterQueryPerformanceFrequency 获得最精细的时间。

    关于使用这些 API 进行代码计时的 MSDN 文章 here(示例代码在 VB 中 - 抱歉)。

    【讨论】:

    • 我记得在多处理器系统上使用它们时存在一些问题。是否记得它是什么以及是否已修复?
    • @André - 正确,YMMV,如果您的 SMP 系统受此影响。 Docs 说“在多处理器计算机上,调用哪个处理器无关紧要。但是,由于基本输入/输出系统 (BIOS) 或硬件抽象层 (HAL) 中的错误,您可能会在不同的处理器上获得不同的结果。”
    • 自多核处理器问世以来,我认为文档没有更新。今天,BIOS 和 HAL 独立于读取内核之间的 TSC 和 TSC 差异。您可以使用 APIC 计时器检查旧系统上的 TSC 漂移。
    【解决方案2】:

    http://www.boost.org/doc/libs/1_45_0/doc/html/date_time/posix_time.html

    虽然

    使用亚秒级分辨率时钟获取 UTC 时间。在 Unix 系统上,这是使用 GetTimeOfDay 实现的。在大多数 Win32 平台上,它是使用 ftime 实现的。 Win32 系统通常无法通过此 API 实现微秒级分辨率。如果更高的分辨率对您的应用程序至关重要,请测试您的平台以查看达到的分辨率。

    【讨论】:

      【解决方案3】:

      最近的实现可以在 Windows 上提供微秒分辨率的时间戳 具有高精度。系统文件时间和性能计数器的联合使用允许 这样的准确性see this threadthis one

      最近的一个实现可以在Windows Timestamp Project找到

      【讨论】:

        【解决方案4】:

        我想已经给出的 QuerPerformance* 答案没有任何问题:问题是针对特定于 Windows 的解决方案,就是这样。对于跨平台的 C++ 解决方案,我猜 boost::chrono 最有意义。 Windows 实施使用 QuerPerformance* 方法,您立即拥有 Linux 和 Mac 解决方案。

        【讨论】:

          【解决方案5】:

          Windows 中有两个高精度(100 ns 分辨率)时钟:

          QueryPerformanceCounter 独立于任何外部时间参考,也不与任何外部时间参考同步。它对于测量绝对时间跨度很有用。

          GetSystemTimePreciseAsFileTime 已同步。如果您的 PC 正在加快或减慢您的时钟以使其逐渐与时间服务器同步,GetSystemTimePreciseAsFileTime 将适当地比绝对时间跨度更慢或更快。

          指导是:

          • 如果您需要 UTC 同步时间戳,例如跨多个系统使用:使用 GetSystemTimePreciseAsFileTime
          • 如果您只需要绝对时间跨度:使用 QueryPerformanceCounter

          阅读奖励

          Windows 中的所有内核级跟踪基础架构都使用 QueryPerformanceCounter 来测量绝对时间跨度。

          GetSystemTimeAsFileTime 对于日志记录之类的东西很有用。

          【讨论】:

            【解决方案6】:

            (因为还没有人提到纯 c++ 方法),

            从 c++11 开始:

            #include <chrono>
            std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch())
            

            获取自 1970-01-01 以来的微秒数,以及 php 的 microtime(true) api 的端口

            #include <chrono>
            double microtime(){
                return (double(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count()) / double(1000000));
            }
            

            以微秒精度为您获取自 1970-01-01 以来的秒数

            【讨论】:

              猜你喜欢
              • 2011-01-25
              • 2012-11-12
              • 2014-07-21
              • 2020-02-13
              • 1970-01-01
              • 2018-10-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多