我使用gprof2dot生成下面的图表,它可视化我的程序的分析输出。
我对图表有些怀疑:
首先,为什么调用树的根不是main(),而根Bat_Read()甚至没有出现在我的程序中,而是在.h文件中声明。
其次,GMatrix是一个没有显式析构函数的C ++类,它调用图中的两个函数是不合理的。几乎一半的时间花费也是不合逻辑的。
第三,图表底部的长函数是什么,花费了6.94%的时间?
您可以在新标签中阅读图表并将其放大,以便您可以清楚地看到它。
答案 0 :(得分:0)
我只是放大了图像,所以我可以阅读它。
底部的函数非常宽,因为它的名称非常长,但它只是红黑树的方法_M_Erase
。它被称为galois_w16_region_multiply
的五十万次。它的大小引起你的注意,但事实上它只出现在大约7%的样本上。
如果您将图表中没有父母的每个区块,并将其包含百分比加起来,您将得到100%。
所有这些都表明gprof
通过调用图向上传播时间的方法是不稳定的,所以它认为事情是最重要的,而事实上它只是无法弄清楚调用者是谁。
你不能从中得到很多。您可以考虑alternatives to gprof
。
ADDED:Gprof将一些入口代码放入用-pg标志编译的每个函数中。因此,当A调用B时,B中的代码会尝试通过使用返回地址并在函数表中查找它来找出调用它的例程。它使用它来增加一个计数器,说出A调用了多少次B.如果由于某种原因它无法找出正确的调用者,那么就会出现如图所示的错误。例如,它表示例程
~vector
~GMatrix
galois_w32_region_multby_2
galois_get_log_table
Bat_Read
位于调用链的顶部(在您的函数中没有调用者)。
更重要的是,它认为main
调用了Bat_Read
。
这是典型的gprof。