perf工具应该都听说过,我也试了一把,感觉很好很强大。
先使用sudo perf stat ./a.out命令,查看一下性能统计信息。结果展示为:
Performance counter stats for './a.out':
2,740.62 msec task-clock # 3.903 CPUs utilized
39 context-switches # 0.014 K/sec
2 cpu-migrations # 0.001 K/sec
128,974 page-faults # 0.047 M/sec
10,394,863,898 cycles # 3.793 GHz
14,055,693,753 instructions # 1.35 insn per cycle
2,865,438,627 branches # 1045.545 M/sec
17,411,072 branch-misses # 0.61% of all branches
0.702237190 seconds time elapsed
2.533414000 seconds user
0.208445000 seconds sys
因为程序基本跑内存的,这里cpu使用比较高,就是开始的时候读了文件。四个线程高达3.9的使用率
context-switches 是进程上下文切换,这个不知道为啥,可能我系统跑的东西太多了。
CPU-migrations 这个是cpu迁移次数,没办法避免吧,程序跑的多,或者需要cpu绑定。
page-faults 这个感觉有点高,不知道为啥,我这还没涉及文件读写相关,已经这么高了。
branch-misses 这个感觉也比较高,看看使用分支预测改善一下,能不能好。这个需要对比一下。
获取程序的cpu运行时间统计,sudo perf record -e cpu-clock ./a.out,命令会生成perf.data文件,使用perf report查看报告
下边还有个直接展示的高级货,叫做火焰图。用perl写的,感觉好强大,以后可以稍微研究一下怎么生成的。
需要先clone下代码来:git clone --depth=1 https://github.com/brendangregg/FlameGraph.git
上一步收集信息的时候必须加-g参数,用来收集堆栈信息,不然后边生成图像的时候会报错。
sudo perf record -g ./a.out
数据解析
sudo perf script -i perf.data &> perf.unfold
数据折叠
./stackcollapse-perf.pl perf.unfold &> perf.folded
图像生成
./flamegraph.pl perf.folded > perf.svg
生成的图片用chrome查看是有效果的,我用ubuntu自带的图片查看软件,发现不能交互。
我发现对于递归程序,展示的不太友好,虽然能从调用栈中获取到递归深度,但是调用的函数差不多都放到递归最里边了,可能是取样的问题嘛,,
上一篇: C语言差错调试工具1-Callgrind,cachegrind
下一篇: 从一个多线程的bug,看内存屏障相关内容
0 Responses so far.