`clock()`给出通常的时钟而不是CPU时钟

Ice*_*ire 3 c++ time multithreading clock c++-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;
Run Code Online (Sandbox Code Playgroud)

TBB部分确实有效,正如我在Windows资源监视器中看到的那样,所有CPU都可以100%运行.如果我在没有并行化的情况下启动无限循环,则CPU使用率仅为预期的12.5%.

然而,durationSeconds并且durationCpuSeconds完全一样......

我用手表测量了时间,结果是墙上的时间.因此,clock()显然没有显示CPU时间应该大大高于8个并行工作的CPU.是clock()不可靠的还是我失去了一些东西?

Lig*_*ica 6

是的,它在Windows上被打破了.

时钟功能表示自进程启动期间CRT初始化以来已经过了多少挂钟时间.请注意,此函数不严格符合ISO C,后者指定净CPU时间作为返回值.要获得CPU时间,请使用Win32 GetProcessTimes函数.

(来自微软的clock文档)

  • 如果我正确读取文档,总CPU时间应该是`lpKernelTime` +`lpUserTime` - 但更好的选择可能是[QueryProcessCycleTime](https://docs.microsoft.com/sv-se/windows/desktop/api/ realtimeapiset/NF-realtimeapiset-queryprocesscycletime) (2认同)