【发布时间】:2019-06-10 16:20:03
【问题描述】:
我曾经使用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%。
但是,durationSeconds 和 durationCpuSeconds 完全一样...
我用手表测量了时间,结果是挂钟时间。因此,clock() 显然没有显示 CPU 时间,如果 8 个 CPU 100% 并行工作,那么 CPU 时间应该会更高。 clock() 不可靠还是我在这里遗漏了什么?
【问题讨论】:
-
Fwiw,这是将
duration转换为“双倍秒数”的更快更简单的方法:auto durationSeconds = std::chrono::duration<double>{duration}.count(); -
@HowardHinnant 谢谢!它自动使用毫秒?
-
不,它绕过毫秒。它直接从
high_resolution_clock给你的任何东西(通常是纳秒)转换为基于双精度的秒。
标签: c++ multithreading time clock chrono