`clock()`提供常规时钟,而不是CPU时钟

时间:2019-01-16 14:39:56

标签: c++ multithreading time clock chrono

我以前用clock()来获取算法的CPU时间。但是,它似乎不再起作用。我有一个带有8个CPU的Windows 10 VM,如资源监视器中所示。

现在,我这样测量时间:

auto startTime = std::chrono::high_resolution_clock::now();
auto startClocks = std::clock();

// some code with TBB that uses multiple threads

auto endTime = std::chrono::high_resolution_clock::now();
auto endClocks = std::clock();
auto duration = endTime - startTime;
auto clockDuration = endClocks - startClocks;

auto durationSeconds = static_cast<double>(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count()) / 1000.;
auto durationCpuSeconds = 1. * clockDuration / CLOCKS_PER_SEC;

TBB部分肯定可以正常工作,正如我在Windows的资源监视器中看到的那样,所有CPU都可以100%工作。如果我开始不进行并行化的无限循环,则CPU使用率仅达到预期的12.5%。

但是,durationSecondsdurationCpuSeconds完全相同...

我已经用手表测量了时间,结果就是墙上的时间。因此,clock()显然没有显示CPU时间,在8个CPU 100%并行工作的情况下,CPU时间应该明显更长。 clock()不可靠还是我在这里遗漏了一些东西?

1 个答案:

答案 0 :(得分:6)

是的,在Windows上已损坏。

  

时钟功能可以告诉您自进程启动以来CRT初始化以来已经过去了多少个挂钟时间。请注意,此函数不严格符合ISO C,后者将净CPU时间指定为返回值。要获取CPU时间,请使用Win32 GetProcessTimes函数。

(来自Microsoft's clock docs