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

C++ `clock()`提供常规时钟,而不是CPU时钟,c++,multithreading,time,clock,chrono,C++,Multithreading,Time,Clock,Chrono,我过去常常使用clock()来获取算法的CPU时间。然而,它似乎不再起作用了。我有一个带有8个CPU的Windows10VM,这在资源监视器中也可以看到 现在,我这样测量时间: auto startTime = std::chrono::high_resolution_clock::now(); auto startClocks = std::clock(); // some code with TBB that uses multiple threads auto endTime = st

我过去常常使用
clock()
来获取算法的CPU时间。然而,它似乎不再起作用了。我有一个带有8个CPU的Windows10VM,这在资源监视器中也可以看到

现在,我这样测量时间:

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;
auto startTime=std::chrono::high_resolution_clock::now();
自动启动时钟=标准::时钟();
//一些使用TBB的代码使用多个线程
自动结束时间=标准::时钟::高分辨率时钟::现在();
自动结束时钟=标准::时钟();
自动持续时间=结束时间-开始时间;
自动时钟持续时间=结束时钟-开始时钟;
auto durationSeconds=static_cast(std::chrono::duration_cast(duration).count())/1000。;
自动持续时间CPUseConds=1。*时钟持续时间/时钟/秒;
TBB部分肯定能工作,正如我在Windows的资源监视器中看到的,所有CPU都能100%工作。如果我在没有并行化的情况下启动一些无休止的循环,CPU使用率仅为预期的12.5%

但是,
durationSeconds
durationCpuSeconds
完全相同


我用手表测量了时间,结果是墙上的时间。因此,
clock()
显然没有显示CPU时间,当8个CPU 100%并行工作时,CPU时间应该大大增加。
clock()
不可靠吗?还是我这里遗漏了什么?

是的,它在Windows上坏了

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


(from)

因此,似乎我需要在Windows上使用
GetProcessTimes
lpKernelTime
?如果我正确阅读文档,总CPU时间应该是
lpKernelTime
+
lpUserTime
,但更好的选择可能是@tedlynmo Sweet!Fwiw,这里有一个更快更简单的方法将
持续时间
转换为“双精度秒”:
auto-durationSeconds=std::chrono::duration{duration}.count()@HowardHinnant谢谢!它自动使用毫秒?不,它绕过毫秒。它直接将
高分辨率时钟
给你的时间(通常为纳秒)转换为双基秒。