“clock()”提供的是普通时钟而不是CPU时钟

3

我曾经使用clock()来获取算法的CPU时间,但现在好像不起作用了。我有一个 Windows 10 虚拟机,资源监视器中也可以看到它有8个CPU。

现在,我是这样测量时间的:

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%。

然而,“durationSeconds”和“durationCpuSeconds”完全相同...

我用手表测量了时间,结果是墙上时间。因此,“clock()”显然没有显示应该极高的CPU时间,在8个CPU以100%并行工作。难道“clock()”不可靠,还是我漏掉了什么?

顺便说一下,这里有一种更快更简单的方法将 duration 转换为“双精度秒数”:auto durationSeconds = std::chrono::duration<double>{duration}.count(); - Howard Hinnant
@HowardHinnant 谢谢!它会自动使用毫秒吗? - IceFire
不,它跳过了毫秒。它直接将从high_resolution_clock获取的时间(通常是纳秒)转换为基于double的秒数。 - Howard Hinnant
1个回答

6

是的,在Windows上出现了问题。

clock函数告诉我们自CRT初始化以来进程启动经过了多少墙钟时间。请注意,此函数不严格遵循ISO C,该标准指定返回值为净CPU时间。要获取CPU时间,请使用Win32 GetProcessTimes函数。

(来源:Microsoft的clock文档)


所以,看起来我需要在Windows上使用GetProcessTimeslpKernelTime - IceFire
2
如果我正确地阅读了文档,总 CPU 时间应该是 lpKernelTime + lpUserTime - 但更好的选择可能是 QueryProcessCycleTime - Ted Lyngmo
@TedLyngmo 很棒! - IceFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接