您的位置:首页 >C++获取CPU占用率方法及调用技巧
发布于2026-03-09 阅读(0)
扫一扫,手机访问
最稳低开销的CPU占用率计算:Windows用GetSystemTimes(需注意权限、两次调用间隔≥100ms、FILETIME转微秒),Linux读/proc/stat首行并按字段语义解析,跨平台避免std::chrono直接减系统时间戳,采样间隔宜200–500ms。

GetSystemTimes 算 CPU 占用率,别碰 Performance CounterWindows 下最稳、最低开销的方式是调用 GetSystemTimes,它返回内核态、用户态和空闲时间的 64 位累计 tick 数。自己差分再除以总时间就能算出占用率。很多人一上来就查 Performance Counter(比如 "\Processor(_Total)\% Processor Time"),结果发现初始化慢、权限要求高、多线程下容易卡住——它本质是 COM 接口封装,不适合高频采样。
GetSystemTimes 要求进程有 SE_INCREASE_QUOTA_NAME 权限,但普通 GUI 进程默认就有,服务进程可能需显式提权FILETIME 是 100ns 单位,要转成毫秒得除以 10000;总时间 = 用户 + 内核 − 空闲/proc/stat 的第一行,别 parse 全部字段Linux 没有统一 syscall 提供 CPU 占用率,/proc/stat 是唯一可靠来源。关键只看第一行 cpu 开头那条(含所有 CPU 总和),后面每行 cpu0、cpu1 是单核数据,除非你真要监控核级负载。
user nice system idle iowait irq softirq steal guest guest_nice,但内核版本不同字段数可能变(如 2.6.33+ 加了 guest),所以务必按空格 split 后取前 8–10 个数字,别硬写索引user + nice + system + irq + softirq 当“忙时间”,idle + iowait 当“空闲时间”;steal 和 guest 属于虚拟化开销,一般不计入主机 CPU 占用/proc/stat 是纯文本 I/O,频繁调用(如每 100ms)会触发 page cache 压力,建议用 mmap 或至少 read 配合固定 buffer 复用std::chrono 直接减 FILETIME 或 timespecWindows 的 FILETIME 和 Linux 的 timespec 都是纳秒/100ns 级时间戳,但 std::chrono::steady_clock::now() 在不同平台底层实现不同(Windows 是 QPC,Linux 是 clock_gettime(CLOCK_MONOTONIC)),直接拿它们跟系统时间戳做减法会出错。
FILETIME 转成 uint64_t(乘 10000 得微秒),再转 std::chrono::microseconds 构造 time_pointtimespec 的 tv_sec * 1000000000ULL + tv_nsec 当纳秒总数,再进 std::chrono::nanosecondsauto delta = now2 - now1 然后直接除——类型不匹配会导致静默截断或负值top 类工具的“瞬时值”其实是伪实时所谓“当前 CPU 占用率”根本不存在——它永远是两个时间点之间的平均值。你看到的 73% 是过去 200ms 内的均值,不是此刻某一微秒的状态。很多监控程序设成 100ms 采样,结果曲线毛刺严重,误以为是波动大,其实是噪声放大。
idle 时间可能被宿主调度器“稀释”,导致算出的占用率虚高,这时得结合 steal 字段校正事情说清了就结束
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9