以下是我从个人资料数据中获得的内容。我无法理解为什么主要的电话不止一次?
% 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生成配置文件。
调用:是调用函数的总次数。如果从未调用该函数,或者无法确定调用它的次数(可能是因为该函数未使用启用的分析编译),则调用字段为空。
答案 0 :(得分:1)
-pg
导致gcc
在每个例程B的序言中插入代码。该代码查看堆栈以试图找出调用者A是谁。然后它增加A调用B的次数。
您可以看到这个过程容易混淆是多么容易。 它通过查找其数量为链接器映射的地址(当然是哈希)来定位例程。 如果该地图与实际代码之间存在任何不匹配的情况,那么结果将比通常情况下更不合理。
看,如果您正试图了解如何让代码更快,here's the method I use。