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

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

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

运行阶段能做什么

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

全部留言(16)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2
  • 学习者
    打卡,这块的内容对我还太深奥,后面再二刷吧

    作者回复: keep going.

    归属地:广东
  • 虹之间
    我使用perf的火焰图测试CPU占用率,显示占用最频繁的是perf开头的一些函数,是我使用不正确吗?

    作者回复: 可能是perf用法不对,没有观察到正确的进程,可以网上找一些相关的资料再看看。

收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部