为什么在gprofile配置文件中调用main不止一次?

时间:2013-12-16 10:50:35

标签: c gprof

以下是我从个人资料数据中获得的内容。我无法理解为什么主要的电话不止一次?

   %   cumulative   self              self     total           
  time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00       96     0.00     0.00  fun
  0.00      0.00     0.00       33     0.00     0.00  __x86.get_pc_thunk.bx
  0.00      0.00     0.00       27     0.00     0.00  main

更奇怪的是,我的代码就像那样

 void foo() {
  foo1();
  if ( a condition) foo2();
}

%   cumulative   self              self     total    
 time   seconds   seconds    calls  us/call  us/call  name    
 54.55      0.06     0.06     6115     9.81     9.81  foo1
 18.18      0.08     0.02   252520     0.08     0.08  cmp_by_weight
  9.09      0.09     0.01   865699     0.01     0.01  foo2

为什么foo2()的调用比foo1()的调用多?

我在编译时使用了-pg选项。然后使用gprof -a exe gmon.out从gmon.out生成配置文件。

调用:是调用函数的总次数。如果从未调用该函数,或者无法确定调用它的次数(可能是因为该函数未使用启用的分析编译),则调用字段为空。

1 个答案:

答案 0 :(得分:1)

谁知道? -pg导致gcc在每个例程B的序言中插入代码。该代码查看堆栈以试图找出调用者A是谁。然后它增加A调用B的次数。

您可以看到这个过程容易混淆是多么容易。 它通过查找其数量为链接器映射的地址(当然是哈希)来定位例程。 如果该地图与实际代码之间存在任何不匹配的情况,那么结果将比通常情况下更不合理。

看,如果您正试图了解如何让代码更快,here's the method I use

如果您只是因为某种原因尝试运行探查器,那么有很多选项,包括oprofileZoom等。