我使用gprof2dot生成了下面的图表,它可视化了我的程序的分析输出。
我对这张图有一些疑问:
首先,为什么调用树的根不是main(),根Bat_Read()甚至没有出现在我的程序中,而是在.h文件中声明。
其次,GMatrix是一个没有显式析构函数的C++类,调用图中的这两个函数是不合理的。几乎一半的时间花费也是不合逻辑的。
第三,图底部的长函数是什么,它花费6.94 %的时间?

您可以在一个新的选项卡中读取图表并将其放大,这样您就可以清楚地看到它。
发布于 2013-05-21 14:04:27
我只是放大了图像才能读出来。
底部的函数非常宽,只是因为它有一个非常长的名称,但它只是一个红黑树的方法_M_Erase。它被称为galois_w16_region_multiply的50万倍。它的大小引起了你的注意,但实际上它只出现在大约7%的样本上。
如果您将图表中没有父级的每一个块加起来,并将其包含的百分比加起来,您将得到100%的数据。所有这一切都表明,gprof通过调用图向上传播时间的方法是不可靠的,因此它认为事情是在顶端,而实际上它只是不知道调用者是谁。
添加: Gprof将一些条目代码放入使用-pg标志编译的每个函数中。因此,当A调用B时,B中的代码试图通过使用返回地址并在一个函数表中查找它来找出调用它的例程。它用它来增加一个计数器,它表示A调用了多少次B。如果由于某种原因,它找不到正确的调用者,就会出现错误,就像在这张图中看到的那样。例如,它说例程
~vector
~GMatrix
galois_w32_region_multby_2
galois_get_log_table
Bat_Read在呼叫链的顶端(在你的功能中没有呼叫者)。更重要的是,它认为main是由Bat_Read调用的。
这是典型的gprof。
https://stackoverflow.com/questions/16664288
复制相似问题