首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于gprof和gprof2dot生成的图的几个疑问

关于gprof和gprof2dot生成的图的几个疑问
EN

Stack Overflow用户
提问于 2013-05-21 07:19:47
回答 1查看 740关注 0票数 0

我使用gprof2dot生成了下面的图表,它可视化了我的程序的分析输出。

我对这张图有一些疑问:

首先,为什么调用树的根不是main(),根Bat_Read()甚至没有出现在我的程序中,而是在.h文件中声明。

其次,GMatrix是一个没有显式析构函数的C++类,调用图中的这两个函数是不合理的。几乎一半的时间花费也是不合逻辑的。

第三,图底部的长函数是什么,它花费6.94 %的时间?

您可以在一个新的选项卡中读取图表并将其放大,这样您就可以清楚地看到它。

EN

回答 1

Stack Overflow用户

发布于 2013-05-21 14:04:27

我只是放大了图像才能读出来。

底部的函数非常宽,只是因为它有一个非常长的名称,但它只是一个红黑树的方法_M_Erase。它被称为galois_w16_region_multiply的50万倍。它的大小引起了你的注意,但实际上它只出现在大约7%的样本上。

如果您将图表中没有父级的每一个块加起来,并将其包含的百分比加起来,您将得到100%的数据。所有这一切都表明,gprof通过调用图向上传播时间的方法是不可靠的,因此它认为事情是在顶端,而实际上它只是不知道调用者是谁。

从这件事上你看不出多少。你可以考虑一下

添加: Gprof将一些条目代码放入使用-pg标志编译的每个函数中。因此,当A调用B时,B中的代码试图通过使用返回地址并在一个函数表中查找它来找出调用它的例程。它用它来增加一个计数器,它表示A调用了多少次B。如果由于某种原因,它找不到正确的调用者,就会出现错误,就像在这张图中看到的那样。例如,它说例程

代码语言:javascript
复制
  ~vector
  ~GMatrix
  galois_w32_region_multby_2
  galois_get_log_table
  Bat_Read

在呼叫链的顶端(在你的功能中没有呼叫者)。更重要的是,它认为main是由Bat_Read调用的。

这是典型的gprof。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16664288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档