4

我正在使用谷歌 CPU 分析工具。

http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html

在文档中给出

分析文本输出

文本模式的输出行如下所示:

   14   2.1%  17.2%       58   8.7% std::_Rb_tree::find

以下是如何解释列:

  • 此函数中的分析样本数
  • 此函数中分析样本的百分比
  • 迄今为止打印的函数中的分析样本百分比
  • 此函数及其被调用者中的分析样本数
  • 此函数及其被调用者中分析样本的百分比
  • 函数名称

但我无法理解哪些列告诉我函数的确切或百分比 CPU 使用率?

如何获得使用谷歌个人资料的功能的 CPU 使用?

4

1 回答 1

7

文本模式的输出行如下所示:

它会有很多行,例如,collect profile:

$ CPUPROFILE=a.pprof LD_PRELOAD=./libprofiler.so ./a.out

程序a.out和这里一样:Kcachegrind/callgrind is inaccurate for dispatcher functions?

然后用 pproftop命令分析:

$ 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 列与第 1 列和第 2 列一样;但是这些不仅会考虑给定函数本身的样本,还会考虑从给定直接和间接调用的所有函数的样本。您可以看到,main从它调用的所有内容占总运行时间的 100%(因为main是程序本身;或程序调用树的根),last2其子项占运行时间的 36.8%(它在我的程序中的子项是:一半调用do_4和调用的一半do_3= 41.1 + 27.6 /2 = 69.7/2 ~= 34% + 函数本身的一些时间)

PS:还有一些其他有用的 pprof 命令,例如callgrindgv显示调用树的图形表示并添加了分析信息。

于 2011-11-10T16:58:52.103 回答