c++ - 用于捕获线程 CPU 时间的 API
问题描述
我想测量 CPU 时间,而不是线程上的经过时间。例如,如果一个线程正在等待或休眠,它不应该计入 CPU 时间,因为该线程不处于可运行状态。所以我得到了以下链接来获取 CPU 时间。但是,它似乎是根据我下面的测试来捕获经过的时间(我希望 cpu_time_used 应该接近 0,但实际上是 2)。我错过了什么?
https://www.gnu.org/software/libc/manual/html_node/CPU-Time.html
#include <time.h>
clock_t start, end;
double cpu_time_used;
start = clock();
std::this_thread::sleep_for (std::chrono::seconds(2));
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
解决方案
请注意,clock() 以核心时间为单位进行测量,即CLOCKS_PER_SEC
clock()
滴答表示一个处理器上一秒的计算,因此它表示进程在所有线程上使用的时间量。因此,如果在睡眠期间有另一个线程在运行,它仍然会增加时钟计数 - 如果总共有两个线程,时钟计数将指示 2 秒已经过去,如您所示。如果睡眠线程是唯一的线程,您将获得少量时间,例如 @NateEldredge 报告。在 Linux 上,您可以查询或设置一个计时器CLOCK_THREAD_CPUTIME_ID
,就像@KamilCuk 说的那样。
推荐阅读
- javascript - 如何将自定义字段传递到 mapbox-gl js 以在地图上创建点?
- crystal-reports - 如果字段未更改,Crystal Reports 会抑制组
- loops - 对于我的 C 代码,我不确定二叉树是如何循环的,因为我的预期输出与实际输出不同?
- swift - CustomStringConvertible 崩溃枚举?
- html - iframe 的替代方案 - 第三方网站上的小部件集成
- cluster-computing - 如何使用通配符为分组规则定义 slurm 输出文件名
- java - 如何从 POJO 类的属性名调用 get-set 方法
- python - 有没有办法让频率包括工作日但在 Python 中没有(美国)假期?
- android - findViewById 与 PhotoView 库问题
- java - 通过 Join Table 的子步骤的 JPA