0

0

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

尼克

尼克

发布时间:2026-02-08 15:07:02

|

785人浏览过

|

来源于php中文网

原创

最稳低开销的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 接口封装,不适合高频采样。

  • 必须每轮都调用两次:一次取旧值,间隔几百毫秒后再取新值,否则差分为 0
  • 两次调用之间不能小于 100ms,否则精度崩(系统只在特定中断点更新这些计数器)
  • GetSystemTimes 要求进程有 SE_INCREASE_QUOTA_NAME 权限,但普通 GUI 进程默认就有,服务进程可能需显式提权
  • 返回的 FILETIME 是 100ns 单位,要转成毫秒得除以 10000;总时间 = 用户 + 内核 − 空闲

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

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

  • 该行字段顺序固定: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 当“空闲时间”;stealguest 属于虚拟化开销,一般不计入主机 CPU 占用
  • /proc/stat 是纯文本 I/O,频繁调用(如每 100ms)会触发 page cache 压力,建议用 mmap 或至少 read 配合固定 buffer 复用

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

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

  • Windows 下把 FILETIME 转成 uint64_t(乘 10000 得微秒),再转 std::chrono::microseconds 构造 time_point
  • Linux 下把 timespectv_sec * 1000000000ULL + tv_nsec 当纳秒总数,再进 std::chrono::nanoseconds
  • 千万别写 auto delta = now2 - now1 然后直接除——类型不匹配会导致静默截断或负值

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

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

Favird No-Code Tools
Favird No-Code Tools

无代码工具的聚合器

下载

立即学习C++免费学习笔记(深入)”;

  • 真实场景中,200–500ms 是平衡精度与稳定性的合理区间;低于 100ms 不仅没意义,还会因系统计数器更新延迟导致大量重复值
  • 如果要做告警(比如 >90% 持续 5 秒),别对单次采样值判断,应维护一个滑动窗口(如最近 10 个值),检查是否连续 N 次超阈值
  • 注意:虚拟机idle 时间可能被宿主调度器“稀释”,导致算出的占用率虚高,这时得结合 steal 字段校正

事情说清了就结束

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1322

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

276

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2200

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

34

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

613

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

283

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

23

2026.01.21

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

67

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.7万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号