我正在使用Google CPU Profiling工具。
http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html
在文件上给出了
分析文本输出
文本模式的输出行如下所示:
14 2.1% 17.2% 58 8.7% std::_Rb_tree::find
以下是如何解释列:
但我无法理解哪些列告诉我功能的CPU使用率的确切或百分比?
如何获取使用谷歌个人资料的功能的CPU使用?
答案 0 :(得分:7)
文本模式的输出行如下所示:
它会有很多行,例如,收集个人资料:
$ CPUPROFILE=a.pprof LD_PRELOAD=./libprofiler.so ./a.out
程序a.out
与此处相同:Kcachegrind/callgrind is inaccurate for dispatcher functions?
然后用pprof top
命令分析它:
$ pprof ./a.out a.pprof
Using local file ./a.out.
Using local file a.pprof.
Welcome to pprof! For help, type 'help'.
(pprof) top
Total: 185 samples
76 41.1% 41.1% 76 41.1% do_4
51 27.6% 68.6% 51 27.6% do_3
37 20.0% 88.6% 37 20.0% do_2
21 11.4% 100.0% 21 11.4% do_1
0 0.0% 100.0% 185 100.0% __libc_start_main
0 0.0% 100.0% 185 100.0% dispatcher
0 0.0% 100.0% 34 18.4% first2
0 0.0% 100.0% 42 22.7% inner2
0 0.0% 100.0% 68 36.8% last2
0 0.0% 100.0% 185 100.0% main
那么,这里是什么:总样本数是185;并且频率是默认值(每10毫秒1个样本;或每秒100个样本)。然后总运行时间约为1.85秒。
第一列是a.out在给定函数中工作时采用的样本数。如果我们将它除以频率,我们将获得给定函数的总时间估计,例如, do_4
运行约0.8秒
第二列是给定函数中的样本计数除以总计数,或此函数在总程序运行时间中的百分比。所以do_4
是最慢的函数(占程序总时间的41%),而do_1
只是程序运行时的11%。我想你对这个专栏感兴趣。
第三列是当前行和前一行的总和;所以我们可以知道2个最慢的函数do_4
和do_3
占总运行时间的68%(41%+ 27%)
第4和第5列像第一和第二列;但是这些不仅会考虑给定函数本身的样本,还会直接或间接地考虑从给定函数调用的所有函数的样本。你可以看到,main
和从它调用的所有内容都是总运行时间的100%(因为main
是程序本身;或程序的calltree的根)和last2
及其子项是运行时间的36.8%(我的程序中的子项为:do_4
的一半调用和do_3
的调用的一半= 41.1 + 27.6 / 2 = 69.7 / 2~ = 34%+一段时间功能本身)
PS:还有一些其他有用的pprof命令,如callgrind
或gv
,它们显示了调用树的图形表示,并添加了分析信息。