程序执行时间计数器

Programme execution time counter

本文关键字:计数器 执行时间 程序      更新时间:2023-10-16

在C++中计算运行时间的最准确方法是什么?我用clock()来计算这个,但我觉得这是错误的,因为我90%的时间是0毫秒,其余的时间是15毫秒,这对我来说没有什么意义

即使它真的很小,非常接近0毫秒,有没有更准确的方法可以给我确切的值,而不是向下舍入0毫秒?

clock_t tic = clock();
/*
  main programme body
*/
clock_t toc = clock();
double time = (double)(toc-tic);
cout << "nTime taken: " << (1000*(time/CLOCKS_PER_SEC)) << " (ms)";

感谢

对于C++11,我会使用

#include <chrono>
auto t0 = std::chrono::high_resolution_clock::now();
...
auto t1 = std::chrono::high_resolution_clock::now();
auto dt = 1.e-9*std::chrono::duration_cast<std::chrono::nanoseconds>(t1-t0).count();

以秒为单位的经过时间。


对于2011年以前的C++,您可以在windows上使用QueryPerformanceCounter(),也可以在linux/OSX上使用gettimeofday()。例如(这实际上是C,而不是C++):

timeval oldCount,newCount;
gettimeofday(&oldCount, NULL);
...
gettimeofday(&newCount, NULL);
double t = double(newCount.tv_sec -oldCount.tv_sec )
         + double(newCount.tv_usec-oldCount.tv_usec) * 1.e-6;

以秒为单位的经过时间。

std::chrono::high_resolution_clock是一个尽可能便携的解决方案,但它实际上可能不会比您已经看到的分辨率更高。

每当计时器中断处理程序更新系统时间时,几乎任何返回系统时间的函数都会向前跳,10ms是现代操作系统的典型间隔。

为了获得更好的精确计时,您需要访问CPU周期计数器或高精度事件计时器(HPET)编译器库供应商应该将它们用于high_resolution_clock,但并非所有供应商都这样做。因此,您可能需要特定于操作系统的API。

(注意:特别是Visual C++high_resolution_clock使用低分辨率系统时钟。但可能还有其他时钟。)

例如,在Win32上,QueryPerformanceFrequency()QueryPerformanceCounter()函数是一个不错的选择。有关符合C++11定时器接口并使用这些函数的包装器,请参阅

  • Mateusz回答"std::system_clock和std::steady_lock之间的区别?"

如果您有C++11可用,请使用chrono库。

此外,不同的平台提供了对高精度时钟的访问。

例如,在linux中,使用clock_gettime。在Windows中,使用高性能计数器api。

示例:

C++11:

auto start=high_resolution_clock::now();
...  // do stuff
auto diff=duration_cast<milliseconds>(high_resolution_clock::now()-start);
clog << diff.count() << "ms elapsed" << endl;