2

在 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)";

谢谢

4

3 回答 3

7

使用 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++,您可以QueryPerformanceCounter()在 Windows 或gettimeofday()linux/OSX 上使用。例如(这实际上是 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;

以秒为单位的经过时间。

于 2013-07-15T13:41:19.117 回答
3

std::chrono::high_resolution_clock是您可以获得的最便携的解决方案,但它实际上可能并不比您已经看到的分辨率更高。

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

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

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

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

于 2013-07-15T13:40:01.650 回答
0

如果您有可用的 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;
于 2013-07-15T13:45:41.340 回答