【问题标题】:Get local time in nanoseconds [duplicate]以纳秒为单位获取本地时间[重复]
【发布时间】:2012-10-07 22:13:39
【问题描述】:

可能重复:
C++ Timer function to provide time in nano seconds

我需要以纳秒分辨率测量函数执行的持续时间。可能吗?我们普通的计算机硬件和软件能给出这样的时间精度吗?如果是,如何用 C++ 来实现? Boost库可以吗?

【问题讨论】:

  • 你有什么电脑? CPU的速度是多少?
  • @Narek 从中您可以计算出您想要的精度是否可以达到。
  • 如果内在函数在您的编译器上可用,并且您的硬件支持它(i5 应该),您可以使用 RDTSC。您会发现很多人将您从 RDTSC 中远离,因为适当地使用它可能是一个挑战,但是对于非常小的时间测量,您无法获得更准确的时间片表示。有关示例,请参见重复问题中的第二个答案。
  • 每个人都来了,被认为是重复的,但现在我没有回答我的问题。我不知道如何使用旧 C++ 在 Windows 上的 NANOSECONDS 中对函数执行持续时间进行基准测试!

标签: c++ boost time benchmarking


【解决方案1】:

我不确定您是否正在寻找时钟或 difftime,但其中之一应该是您正在寻找的:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

你可以在函数前后使用 this 并比较运行时的差异来查看函数的整体运行时间。

【讨论】:

    【解决方案2】:

    您可以使用 Windows API 做的最好的事情是 QueryPerformanceCounter。您可以通过QueryPerformanceFrequency 获取其分辨率。视情况而定,这可能是使用 CPU 的 RDTSC 指令,在这种情况下,频率基本上是 CPU 的时钟频率。在其他情况下,它使用频率为 1.024 MHz 的单独时钟,因此分辨率基本为 1 微秒。

    C++11 添加了一个chrono 类,它也可能很有用——假设您使用的编译器已经拥有它。如果您的编译器不提供实现,Boost Chrono 是一个合理的替代品,适用于大多数现有的编译器/库。同样,不能保证它会提供纳秒级分辨率,但我希望在 Windows 上它可能是 QPC/QPF 的便携式包装器,因此它可能会提供与它们相同的分辨率,只是更便携。

    【讨论】:

      【解决方案3】:

      是的,今天大多数硬件都支持这种分辨率,C++ 标准库也有一个 API 可以支持它。不幸的是,并非所有 C++ 实现都确实提供了它。

      API是C++11中引入的<chrono>库:

      #include <iostream>
      #include <chrono>
      
      int main() {
          auto start = std::chrono::high_resolution_clock::now();
      
          // operation to be timed ...
      
          auto finish = std::chrono::high_resolution_clock::now();
          std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
      }
      

      libc++ for Darwin 中的&lt;chrono&gt; 实现提供纳秒级分辨率,但似乎 VS2012 中的实现只达到十分之一毫秒。上面的代码仍然会以纳秒为单位给出时间,但小于 100 微秒的时间最终会为零纳秒。

      Boost 还提供了一个实现,boost::chrono,它在 Windows 上似乎使用纳秒。它也可用于 C++03。

      #include <boost/chrono.hpp>
      
      int main() {
          boost::chrono::high_resolution_clock::time_point t1 =
              boost::chrono::high_resolution_clock::now();
      
          boost::chrono::high_resolution_clock::time_point t2 =
              boost::chrono::high_resolution_clock::now();
      
          std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
          // boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
      }
      

      【讨论】:

      • 检查 high_resolution_clock 肯定会减慢运行时间。唉……
      【解决方案4】:

      当然还有好老的Boost::date_time:

      #include <boost/date_time/posix_time/posix_time.hpp>
      
      boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
      

      不过,只有微秒。

      【讨论】:

        猜你喜欢
        • 2015-10-09
        • 1970-01-01
        • 2017-08-05
        • 2021-02-22
        • 2011-01-24
        • 2016-08-03
        • 1970-01-01
        • 2021-03-19
        • 2020-09-16
        相关资源
        最近更新 更多