最稳低开销的CPU占用率计算:Windows用GetSystemTimes(需注意权限、两次调用间隔≥100ms、FILETIME转微秒),Linux读/proc/stat首行并按字段语义解析,跨平台避免std::chrono直接减系统时间戳,采样间隔宜200–500ms。

c++如何获取CPU占用率_c++系统监控性能接口调用【核心】

Windows 上用 GetSystemTimes 算 CPU 占用率,别碰 Performance Counter

Windows 下最稳、最低开销的方式是调用 GetSystemTimes,它返回内核态、用户态和空闲时间的 64 位累计 tick 数。自己差分再除以总时间就能算出占用率。很多人一上来就查 Performance Counter(比如 "\Processor(_Total)\% Processor Time"),结果发现初始化慢、权限要求高、多线程下容易卡住——它本质是 COM 接口封装,不适合高频采样。

Linux 下读 /proc/stat 的第一行,别 parse 全部字段

Linux 没有统一 syscall 提供 CPU 占用率,/proc/stat 是唯一可靠来源。关键只看第一行 cpu 开头那条(含所有 CPU 总和),后面每行 cpu0cpu1 是单核数据,除非你真要监控核级负载。

跨平台封装时,避免用 std::chrono 直接减 FILETIMEtimespec

Windows 的 FILETIME 和 Linux 的 timespec 都是纳秒/100ns 级时间戳,但 std::chrono::steady_clock::now() 在不同平台底层实现不同(Windows 是 QPC,Linux 是 clock_gettime(CLOCK_MONOTONIC)),直接拿它们跟系统时间戳做减法会出错。

采样间隔低于 500ms 时,top 类工具的“瞬时值”其实是伪实时

所谓“当前 CPU 占用率”根本不存在——它永远是两个时间点之间的平均值。你看到的 73% 是过去 200ms 内的均值,不是此刻某一微秒的状态。很多监控程序设成 100ms 采样,结果曲线毛刺严重,误以为是波动大,其实是噪声放大。

事情说清了就结束

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。