C++ gprof与cachegrind配置文件

C++ gprof与cachegrind配置文件,c++,optimization,profiling,valgrind,gprof,C++,Optimization,Profiling,Valgrind,Gprof,在尝试优化代码时,我对kcachegrdind和gprof生成的配置文件的差异感到有点困惑。具体地说,如果我使用gprof(使用-pg开关编译,等等),我有: Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call na

在尝试优化代码时,我对
kcachegrdind
gprof
生成的配置文件的差异感到有点困惑。具体地说,如果我使用gprof(使用
-pg
开关编译,等等),我有:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 89.62      3.71     3.71   204626     0.02     0.02  objR<true>::R_impl(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&) const
  5.56      3.94     0.23 18018180     0.00     0.00  W2(coords_t const&, coords_t const&)
  3.87      4.10     0.16   200202     0.00     0.00  build_matrix(std::vector<coords_t, std::allocator<coords_t> > const&)
  0.24      4.11     0.01   400406     0.00     0.00  std::vector<double, std::allocator<double> >::vector(std::vector<double, std::allocator<double> > const&)
  0.24      4.12     0.01   100000     0.00     0.00  Wrat(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<coords_t, std::allocator<coords_t> > const&)
  0.24      4.13     0.01        9     1.11     1.11  std::vector<short, std::allocator<short> >* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<std::vector<short, std::alloca
平面轮廓:
每个样本计为0.01秒。
%累积自我总数
时间秒秒呼叫ms/呼叫ms/呼叫名称
89.62 3.71 3.71 204626 0.02 0.02 objR::R_impl(std::vector const&,std::vector const&)const
5.56 3.94 0.23 18018180 0.00 0.00 W2(协调常数和,协调常数和)
3.87 4.10 0.16 200202 0.00 0.00构建矩阵(标准::向量常数&)
0.24 4.11 0.01 400406 0.00 0.00标准::向量::向量(标准::向量常数&)
0.24 4.12 0.01 100000 0.00 0.00 Wrat(标准::向量常数&,标准::向量常数&)
0.24 4.13 0.01 9 1.11 1.11 std::vector*std:uu uninitialized_uCopy_ua
gprof
是一个仪表化分析器,
callgrind
是一个采样分析器。使用插入指令的探查器,每个函数的入口和出口都会有开销,这可能会扭曲配置文件,特别是当您有相对较小的函数被多次调用时。采样探查器往往更精确——它们会略微降低整个程序的执行速度,但这对所有函数的相对影响是相同的


尝试免费30天评估-我怀疑它会给你一个更符合
callgrind
而不是
gprof

的配置文件。你看错了专栏。您必须查看kcachegrind输出中的第二列,即名为“self”的列。这是特定子例程只花费的时间,而不考虑其子例程。第一列有累计时间(它等于主设备的100%机器时间),但信息量不大(在我看来)


请注意,从kcachegrind的输出可以看出,进程的总时间为53.64秒,而子例程“R_impl”中花费的时间为46.72秒,占总时间的87%。所以gprof和kcachegrind几乎完全一致。

那么你的意思是——扔掉gprof的输出,这是明显错误的,对吗?gprof可以用于某些类型的分析-它产生比采样分析程序更准确的调用图信息,它还可以为某些类型的代码(例如,当主要是大型函数时)生成相当精确的时序配置文件。请尝试另一个探查器,如Zoom,以获得关于实时探查的“决定性投票”。@Zhenya:Paul是对的。试试缩放。gprof有。顺便说一句,gprof是一个采样器,但它只适用于PC,并且只适用于CPU有界的情况,因此它对系统调用所花费的时间是盲目的。它插入函数输入代码不是为了测量函数时间,而是为了将PC命中率计入更高级别的调用方。然后它做出各种各样的假设,把结果搞砸了。它确实会给你图形信息,但除非你的程序很小(没有递归),否则它不会告诉你太多。@Mike,@Paul:谢谢!出于好奇:在Zoom和Intel的VTune之间选择有什么具体的优点和/或缺点吗?什么??gprof正在采样(它将每10或1毫秒对PC进行一次采样,以获得%%count in输出),cachegrind/callgrind正在检测(它们使用valgrind动态检测代码,并通过检测统计在基本块层进行计数)。Cachegrind/callgrind甚至在模拟探查器,因为它测量的不是实时事件,而是虚拟事件(模拟缓存层次结构、模拟分支预测、在没有任何暂停的情况下获取的指令),我认为默认情况下callgrind会在机器指令中显示函数成本。在屏幕截图上,我们可以看到相对成本的百分比。因此,R_impl包含分析期间执行的所有指令的46.72%。