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

`clock()` gives usual clocks instead of CPU clocks

本文关键字:时钟 CPU clock      更新时间:2023-10-16

我曾经花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()不可靠还是我在这里错过了什么?

是的,它在Windows上坏了。

时钟函数在进程启动期间显示自 CRT 初始化以来经过了多少挂钟时间。请注意,此函数并不严格符合 ISO C,后者将净 CPU 时间指定为返回值。若要获取 CPU 时间,请使用 Win32 获取进程时间函数。

(摘自Microsoft clock文档)