linux下唯一轻量可靠方案是读/proc/stat的cpu行,两次采样≥200ms,用unsigned long long解析字段,空闲时间= idle + iowait,使用率=(total_delta - idle_delta - iowait_delta)/total_delta;windows需用getsystemtimes(vista+)或pdhcollectquerydata,禁用getloadavg和wmi。

Linux 下直接读 /proc/stat 是唯一轻量、可靠、无需权限的方案;Windows 必须用 GetSystemTimes(Vista+)或 PdhCollectQueryData(需链接 pdh.lib),别碰 getloadavg 或 WMI——它们不是 CPU 使用率。
Linux:两次读 /proc/stat 的 cpu 行算全局负载
第一行以 cpu (注意末尾空格)开头的才是总和,不是 cpu0。字段顺序固定:user、nice、system、idle、iowait、irq、softirq、steal……总时间 = 所有字段和,空闲时间 = idle + iowait(严格定义下 iowait 属于“等待 I/O 的空闲”,应计入空闲)。
必须两次采样,间隔 ≥200ms:
- 用
std::this_thread::sleep_for(std::chrono::milliseconds(250))控制间隔,别用clock_gettime做同步——这里只需要稳定延迟 - 所有字段必须用
unsigned long long存储,%llu解析,否则高负载机器上idle几小时就溢出 - 计算公式是:
(total_delta - idle_delta - iowait_delta) / total_delta,不是1.0 - idle_delta / total_delta(除非你明确排除iowait) - 若两次采样间系统休眠,
total_delta可能突增 >1e9 jiffies/250ms,此时整组数据应丢弃
Linux:逐行解析 cpu0、cpu1 等获取每核明细
/proc/stat 后续每一行以 cpu 开头 + 数字(如 cpu0、cpu1、cpu000)对应逻辑核,字段顺序与 cpu 行一致。不能硬编码循环到 64 或 128——容器或节能模式下部分核可能不在线。
安全匹配方式:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
line.substr(0, 3) == "cpu"初筛,再检查第 3 个字符是否为数字(std::isdigit(line[3])),避开cpuidle等干扰项 - 不要用
std::regex——开销大且易被cpu000这类前导零搞错 - 每核必须单独算使用率:
(total_core_delta - idle_core_delta) / total_core_delta,不能把所有核的idle加起来除以总核数 - 某些 ARM 或虚拟机环境只暴露
cpu行,无单核数据,代码需 fallback 到仅返回全局值
Windows:用 GetSystemTimes 算全局,用 PdhCollectQueryData 算单核
GetSystemTimes 返回三个 FILETIME:空闲、内核(含空闲)、用户。它只适用于 Vista 及以后系统,且需链接 advapi32.lib。内核态真实时间 = kernelTime - idleTime,总活跃时间 = userTime + kernelTime - idleTime。
关键细节:
-
FILETIME是 100 纳秒单位,必须转成ULARGE_INTEGER或uint64_t再相减,直接操作结构体字段会出错 - 函数返回
FALSE时,检查GetLastError():若为ERROR_ACCESS_DENIED,说明权限不足(但通常进程默认有);若为ERROR_PROC_NOT_FOUND,则系统不支持(XP 或精简版) - 单核明细无法用
GetSystemTimes获取,必须走 PDH:\Processor(0)\% Processor Time,首次调用后至少等 1 秒再取值,否则返回PDH_INVALID_DATA -
PdhCollectQueryData需要手动格式化:PdhGetFormattedCounterValue返回的是整型毫秒值,除以10000.0才得百分比
跨平台封装时最容易忽略的三件事
一是误把 sysconf(_SC_NPROCESSORS_ONLN) 当作负载指标——它只返回当前在线逻辑核数,和忙闲无关;二是试图平均各核使用率来算全局值——/proc/stat 的 cpu 行本身已是加权总和,再平均就失真;三是用 getloadavg 替代 CPU 使用率——它返回的是运行队列长度均值,在 8 核机器上 load=1.0 ≈ 12.5% CPU 利用率(仅理论极限),实际完全不可映射。
真正需要区分单核/多核的,只有性能分析场景;监控面板上那个 “CPU usage 85%”,几乎总是来自 /proc/stat 的 cpu 行或 GetSystemTimes,而不是各核平均。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










