罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
35514 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

18 | 性能分析:找出程序的瓶颈

性能分析的经验
运行阶段能做的事情
性能分析与优化: 艰深的课题,广泛的议题
性能分析工具: top、pstack、strace、perf、gperftools
HeapProfiler: 分析内存
CPUProfiler: 按频率采样程序函数调用情况
工具: Google Performance Tools (gperftools)
perf: 按频率采样统计函数调用次数
strace: 显示进程系统调用信息
pstack: 打印进程调用栈信息
top: 查看CPU、内存等关键性能指标
工具: top、pstack、strace、perf
范围: CPU利用率、内存占用率、网络吞吐量、系统延迟
关键: 测量,用数据说话
定义: 动态程序分析方法,采集信息,找出瓶颈,指明优化方向
与调试关系: 相辅相成
目标: 检验程序功能和性能,保证软件质量
作用: 降低CPU速度,理清程序动态流程
工具: GDB
性能分析
测试
调试
课下作业
小结
源码级工具
系统级工具
性能分析
测试
调试
运行阶段能做什么
性能分析

该思维导图由 AI 生成,仅供参考

你好,我是 Chrono。
今天是“技能进阶”单元的最后一节课,我也要兑现刚开始在“概论”里的承诺,讲一讲在运行阶段我们能做什么。

运行阶段能做什么

在编码阶段,你会运用之前学习的各种范式和技巧,写出优雅、高效的代码,然后把它交给编译器。经过预处理和编译这两个阶段,源码转换成了二进制的可执行程序,就能够在 CPU 上“跑”起来。
在运行阶段,C++ 静态程序变成了动态进程,是一个实时、复杂的状态机,由 CPU 全程掌控。但因为 CPU 的速度实在太快,程序的状态又实在太多,所以前几个阶段的思路、方法在这个时候都用不上。
所以,我认为,在运行阶段能做、应该做的事情主要有三件:调试(Debug)、测试(Test)和性能分析(Performance Profiling)。
调试你一定很熟悉了,常用的工具是 GDB,我在前面的“轻松话题”里也讲过一点它的使用技巧。它的关键是让高速的 CPU 慢下来,把它降速到和人类大脑一样的程度,于是,我们就可以跟得上 CPU 的节奏,理清楚程序的动态流程。
测试的目标是检验程序的功能和性能,保证软件的质量,它与调试是相辅相成的关系。测试发现 Bug,调试去解决 Bug,再返回给测试验证。好的测试对于软件的成功至关重要,有很多现成的测试理论、应用、系统(你可以参考下,我就不多说了)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章介绍了在程序运行阶段进行性能分析的重要性以及如何找出程序的瓶颈。作者首先指出在运行阶段能做的事情主要有调试、测试和性能分析。性能分析是一种动态的程序分析方法,通过采集程序的各种信息来找出软件运行的“瓶颈”,为进一步优化性能提供依据。文章重点介绍了CPU性能分析,并推荐了四个“高性价比”的工具:top、pstack、strace和perf。作者详细介绍了这些工具的使用方法和如何通过它们来观测程序的外部参数和内部函数调用,从而分析程序性能。通过这些工具,读者可以快速定位系统的瓶颈,找准性能优化的方向。此外,文章还介绍了一个专业的源码级性能分析工具gperftools,它能够生成文本或者图形化的分析报告,最直观的方式是火焰图。最后,文章提出了两个思考题,引导读者深入思考和探索性能分析的更多内容。整体而言,本文为读者提供了在程序运行阶段进行性能分析的重要性以及实用工具的详细介绍,对于需要进行程序性能优化的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • CoderArthur
    罗老师,能加个微信吗?我的微信是: sail_0323。 30岁了,有些彷徨,不知道该坚持哪些,放弃哪些。想请老师指点指点! 估计有不少同学和我有一样的心声。到时候老师还可以把这个作为轻松话题。

    作者回复: 1.微信这个比较私人,我觉得不要公开出来比较好。 2.可以上GitHub提issue,或者上面也有我的邮箱,发邮件也可以。 3.30岁正年轻啊,我32岁才写了第一本书,感觉这有点像是“少年维特之烦恼”。多看看极客时间大伽的观点,程序员还是很有前途的,路还是要自己走。

    2020-06-16
    2
    25
  • eletarior
    Windows下的使用 wpr 和 wpa ,通过pdb文件直达堆栈,也很方便

    作者回复: Windows很久没用了,欢迎经验分享。

    2020-06-16
    2
    8
  • 黄骏
    性能分析接触一些,实践经验较少,每次写完一个大一些的功能,自己都用perf来看下,抓下数据,看自己代码的cpu使用率咋样。

    作者回复: 这样就是很好的实践了,可以参考课程再试试gperftools和火焰图。

    2020-06-17
    6
  • EncodedStar
    推荐大家可以看看极客时间倪鹏飞老师的linux性能分析系统实战 老师这节总结的确实好,再次感谢老师~

    作者回复: 性能分析范围太大,一节课的内容只能结合C++讲最实用的几个技巧,大家后面可以深入研究。

    2020-06-16
    6
  • robonix
    请问老师有什么好的检查内存泄露的方法?

    作者回复: 最著名的就是valgrind,网上有很多资料。 也可以用gperftools里的heapProfiler,还有agentzh的内存火焰图。 但最好的方法是从写代码的根上解决,不用new/delete,尽量用智能指针、容器还有内存池。

    2020-07-22
    4
  • EncodedStar
    老师,火焰图可以在已经运行的程序中画出来吗?我看到命令都是./a.out ,而且这个程序运行一个while true的话是不是图片特别大? 有没有像perf top -K -p xxx 这样的,直接观察在执行的进程

    作者回复: 可以向运行的进程发信号,然后在代码里收到信号后调用ProfilerStop,这样就可以随时生成火焰图。 或者用systemtap,不需要加gperftools代码,也可以生成火焰图,可以参考一下小贴士里的openresty xray。

    2020-06-16
    4
  • zzuse
    老师,在centos7 arm64鲲鹏架构下,用 gperftools 的 cpu profiler 会出现死锁,尝试后也感觉好难解决。是不是尝试其他工具了

    作者回复: 可以试试在GitHub上提issue,看能否引起开发团队的注意进而解决。 暂时不行就用perf吧,只是性能优化不那么自由灵活,但也基本够用。

    2020-08-02
    2
  • 泰一
    valgrind-callgrind + kcachegrind = 电路图 也是利器

    作者回复: valgrind我用的比较少,对systemtap和火焰图更喜欢一些。

    2020-06-16
    2
  • 王鲜申
    Intel 的 VTune 也非常好用,推荐大家尝试一下

    作者回复: great.

    2023-10-24归属地:上海
  • 学习者
    打卡,这块的内容对我还太深奥,后面再二刷吧

    作者回复: keep going.

    2023-05-21归属地:广东
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部