【问题标题】:`clock()` gives usual clocks instead of CPU clocks`clock()` 给出通常的时钟而不是 CPU 时钟
【发布时间】: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%。

但是,durationSecondsdurationCpuSeconds 完全一样...

我用手表测量了时间,结果是挂钟时间。因此,clock() 显然没有显示 CPU 时间,如果 8 个 CPU 100% 并行工作,那么 CPU 时间应该会更高。 clock() 不可靠还是我在这里遗漏了什么?

【问题讨论】:

  • Fwiw,这是将duration 转换为“双倍秒数”的更快更简单的方法:auto durationSeconds = std::chrono::duration&lt;double&gt;{duration}.count();
  • @HowardHinnant 谢谢!它自动使用毫秒?
  • 不,它绕过毫秒。它直接从 high_resolution_clock 给你的任何东西(通常是纳秒)转换为基于双精度的秒。

标签: c++ multithreading time clock chrono


【解决方案1】:

是的,它在 Windows 上坏了。

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

(来自Microsoft's clock docs

【讨论】:

  • 那么,看来我需要在Windows上使用GetProcessTimeslpKernelTime
  • 如果我正确阅读文档,总 CPU 时间应该是 lpKernelTime + lpUserTime - 但更好的选择可能是 QueryProcessCycleTime
  • @TedLyngmo Sweet!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2015-01-19
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多