系统性能分析工具:perf
系统性能优化通常可以分为两个阶段:性能分析和性能优化 。
性能分析的目的是查找性能瓶颈、热点代码 , 分析引发性能问题的原因;基于性能分析 , 可以进行性能优化 , 包括:算法优化(空间复杂度和时间复杂度的权衡)和代码优化(提高执行速度、减少内存占用) 。 1、perf的原理Linux性能计数器是一个基于内核的子系统 , 它提供一个性能分析框架 , 比如硬件(CPU、PMU(PerformanceMonitoringUnit))功能和软件(软件计数器、tracepoint)功能 。
通过perf , 应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计 。
sudoaptinstalllinux-tools-commonlinux-tools-genericlinux-tools-`uname-r`3、top的使用top命令也是Linux下的性能分析工具 , 能够实时显示系统中各个进程的资源占用状况 。
使用perf之前 , 可以先用top命令查看指定进程(xxx)的CPU占用率是否异常 , 命令如下:
top-p`psaux|grep"xxx"|grep-vgrep|cut-c9-15`-d1-b上面命令的含义是通过top查看指定进程(xxx)的整体运行情况 , 其中 ,
top-p:指定进程top-d1:指定屏幕刷新时间 , 1s刷新一次top-b:表示以批处理模式操作psaux:列出所有进程grep:查找指定进程grep-v:反向查找cut-c9-15:选择每行指定列的字符
sudoperfrecord-a--call-graphdwarf-p`psaux|grep"xxx"|grep-vgrep|cut-c9-15`其中 ,
-a:表示对所有CPU采样--call-graphdward:表示分析调用栈的关系-p:表示分析指定的进程通过Ctrl+C结束后 , 会生成perf.data文件 , 然后通过report导出报告 , 即可以查看main函数和子函数的CPU平均占用率 。
sudoperfreport-iperf.data>perf.txt5、perf使用示例比如 , 有下面一段代码 。
#include#includeusingnamespacestd;voidfor_loop(){for(inti=0;i<1000;i++){for(intj=0;j<10000;j++){intx=sin(i)+cos(j);}}}voidloop_small(){for(inti=0;i<10;i++){for_loop();}}voidloop_big(){for(inti=0;i<100;i++){for_loop();}}intmain(){loop_big();loop_small();return0;}其中 ,
for_loop()是一个两层循环 , 每次都要计算正弦和余弦的和 , 这是一个比较耗时的函数;loop_small()把for_loop()循环10次;loop_big()把for_loop()循环100次 。 【系统性能分析工具:perf】可以明显看出main()函数中loop_big()函数会占大部分CPU , 下面通过perf命令验证下 。
1)假设指定可执行文件的名称为“perf_for” ,
g++perf_for.cpp-operf_for2)运行perf_for之后 , 启动perfrecord:
sudoperfrecord-a--call-graphdwarf-p`psaux|grep"perf_for"|grep-vgrep|cut-c9-15`-d1-b3)结束后 , 通过perfreport导出报告:
sudoperfreport-iperf.data>perf.txt如下图所示 , 可以看出main函数90%的CPU都花在loop_big()函数上 。
推荐阅读
- 太平洋汽车网|欧拉好猫新增GT版 性能或超200PS/电动小钢炮
- 为何CBA本土第一人易建联如此受球迷欢迎?看完分析,豁然开朗
- 德雷斯|剑与远征德雷斯技能详细分析
- 现代迎来技术“爆发”解读第十代索纳塔动力系统
- 苹果|再次确认如果安卓系统不支持微信,鸿蒙OS是最大赢家
- 性能超凡,哥伦比亚级核潜艇未来可期,美投入180亿美元开造!
- 办理美国留学签证需要offer业界内最独到分析
- 蒋哲浩:8.17黄金白银能否再次创新的高位金银分析
- Android系统|如果华为Mate40Pro定价5999元起,那我一定会劝你买它
- 欧拉好猫新增GT版 性能或超200PS/电动小钢炮