在C ++中计算已用时间的最准确方法是什么?我用clock()来计算这个,但是我觉得这是错误的,因为我得到0 ms的90%的时间和15 ms的剩余部分,这对我来说没什么意义。
即使它非常小且非常接近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)";
由于
答案 0 :(得分: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 ++,您可以在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;
以秒为单位的经过时间。
答案 1 :(得分:3)
std::chrono::high_resolution_clock
是您可以获得的便携式解决方案,但实际上它可能不会比您已经看到的更高。
几乎所有返回系统时间的函数都会在定时器中断处理程序更新系统时间时向前跳转,而现代操作系统的10ms是典型的间隔。
为了获得更好的精确计时,您需要访问CPU周期计数器或高精度事件计时器(HPET)。 编译器库供应商应将这些用于high_resolution_clock
,但并非所有人都这样做。因此您可能需要特定于操作系统的API。
(注意:具体为Visual C++ high_resolution_clock
uses the low resolution system clock。但也有可能是其他人。)
例如,在Win32上,QueryPerformanceFrequency()
和QueryPerformanceCounter()
函数是一个不错的选择。对于符合C ++ 11计时器接口并使用这些函数的包装器,请参阅
答案 2 :(得分:0)
如果您有C ++ 11可用,请使用chrono库。
此外,不同的平台可以访问高精度时钟。
例如,在linux中,使用clock_gettime。在Windows中,使用high performance counter 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;