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.