c++如何用gprof进行性能分析 c++代码性能瓶颈定位【工具】

发布时间 - 2026-01-02 00:00:00    点击率:
gprof 分析 C++ 性能需编译时加 -pg 且建议 -O0 -g,运行生成 gmon.out 后用 gprof 解析,可定位 CPU 瓶颈;但不适用于 I/O、多线程及短时程序。

用 gprof 分析 C++ 程序性能,核心是编译时加 -pg,运行后生成 gmon.out,再用 gprof 解析。它能告诉你哪些函数耗时最多、被调用了多少次、调用关系如何,适合定位 CPU 密集型瓶颈。

编译和运行:必须带 -pg 且禁用优化干扰

gprof 依赖插桩(instrumentation),所以编译时要加 -pg,同时建议关闭优化(或仅用 -O1),否则函数内联、重排会影响调用图准确性:

  • 错误示范g++ -O2 -pg main.cpp -o app → 优化可能吞掉函数边界,调用统计失真
  • 推荐做法g++ -g -O0 -pg main.cpp -o app-g 保留符号信息,方便显示函数名)
  • 运行一次程序:./app → 自动在当前目录生成 gmon.out

生成报告:gprof 命令常用组合

直接运行 gprof app 会输出扁平化(flat)和调用图(call graph)两部分。常用增强方式:

  • 显示函数名而非地址:gprof app gmon.out(默认行为,前提是编译带 -g
  • 只看耗时 top 10:gprof app gmon.out | head -n 50
  • 排除库函数干扰(聚焦自己的代码):gprof app gmon.out -q "your_namespace::|main"
  • 生成可读性更强的调用图:gprof app gmon.out -q > callgraph.txt

读懂关键字段:重点关注 % time、calls、self ms/call

扁平化报告中三列最关键:

  • % time:该函数独占时间占总执行时间的百分比(不含子函数)→ 找“大头”
  • calls:被调用次数 → 高频小函数也可能成瓶颈(比如循环里反复调用的 get())
  • self ms/call:每次调用自身平均耗时(不含子函数)→ 判断单次开销是否异常

例如某 calculate() 占 42% 时间、调用 1 次、每次耗时 850ms,说明它内部有严重计算密集逻辑;而 vec_push_back() 占 18%、调用 10 万次,就要检查是否误在循环里重复分配或拷贝。

注意局限性:gprof 不适合测 I/O、多线程、短时程序

gprof 是基于计数器采样 + 插桩的混合机制,有明显约束:

  • 无法准确反映系统调用(如 read()sleep())耗时,这部分常被记为“未归因时间”
  • 不支持多线程(-pg 默认只跟踪主线程,其他线程的调用不会被记录)
  • 程序运行太短(gmon.out 可能为空或数据稀疏,结果不可靠
  • 若函数被内联(即使没开 -O2,某些 trivial 函数仍可能被 GCC 内联),则不会出现在报告中

遇到上述情况,建议换用 perf(Linux)、vtunegoogle-perftools 等更现代工具。


# app  # 工具  # ai  # c++  # 性能瓶颈  # 循环  # 线程  # 多线程  # 主线程  # 不含  # 自己的  # 扁平化  # 最多  # 出现在  # 告诉你  # 适用于  # 执行时间  # 子函数 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS服务器上快速部署高效网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Android自定义控件实现温度旋转按钮效果  香港服务器建站指南:免备案优势与SEO优化技巧全解析  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在建站主机中优化服务器配置?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel如何优化应用性能?(缓存和优化命令)  JavaScript实现Fly Bird小游戏  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何快速上传建站程序避免常见错误?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  javascript基本数据类型及类型检测常用方法小结  如何在阿里云服务器自主搭建网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel观察者模式如何使用_Laravel Model Observer配置  如何正确下载安装西数主机建站助手?  如何实现javascript表单验证_正则表达式有哪些实用技巧  移动端脚本框架Hammer.js  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何撰写建站申请书?关键要点有哪些?  如何在建站之星网店版论坛获取技术支持?  微信推文制作网站有哪些,怎么做微信推文,急?  如何在阿里云虚拟主机上快速搭建个人网站?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  PHP 500报错的快速解决方法  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel如何处理文件下载请求?(Response示例)  如何选择可靠的免备案建站服务器?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  英语简历制作免费网站推荐,如何将简历翻译成英文?  iOS UIView常见属性方法小结  Laravel如何实现本地化和多语言支持?(i18n教程)  公司门户网站制作流程,华为官网怎么做?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何在Windows服务器上快速搭建网站?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Python文件异常处理策略_健壮性说明【指导】