使用gprof与套接字
我有一个我想用gprof进行配置的程序。 问题(表面上)是它使用套接字。 所以我得到这样的东西:
::select(): Interrupted system call
我一会儿回到这个问题,放弃了,然后继续前进。 但我真的很想能够剖析我的代码,如果可能,请使用gprof。 我能做什么? 有没有我错过的gprof选项? 套接字选项? 在这些类型的系统调用中gprof是完全无用的吗? 如果是这样,是否有一个可行的选择?
编辑:平台:
无论分析器如何,套接字代码都需要处理中断的系统调用 ,但在剖析器中它是不可避免的。 这意味着有类似的代码。
if ( errno == EINTR ) { ...
每次系统调用后。
例如,看一下这里的背景。
gprof(这里是论文)是可靠的,但它只是有意测量变化,甚至为此,它只测量CPU限制的问题。 它从来没有被宣传为有用的定位问题。 这是其他人在其上分层的想法。
考虑这种方法。
Zoom是另一个不错的选择,如果你不介意花一些钱。
补充:如果我可以给你一个例子。 假设你有一个调用层次结构,其中Main调用了一些次数,A调用了一定次数的B,B调用了C次数,而C用一个套接字或文件等待了一些I / O,而这基本上都是该计划的确如此。 现在,进一步假设每个例程调用下一个例程的次数比实际需要的次数多25%。 由于1.25 ^ 3约为2,这意味着整个程序需要两倍的时间才能运行。
首先,因为所有的时间都花在等待I / O上,所以gprof不会告诉你这段时间是如何度过的,因为它只关注“运行”时间。
其次,假设(仅用于论证)它确实计算了I / O时间。 它可以给你一个通话图,基本上说每个程序都占用了100%的时间。 这是什么告诉你的? 没有比你已经知道的更多。
但是,如果你采取少量的堆栈样本,你会看到每一个例程调用下一代的代码行。 换句话说,它不仅仅给你一个大概百分比的时间估计,它还指向你昂贵的特定代码行。 你可以看看每一行代码,并询问是否有办法少做几次。 假设你这样做,你会得到2加速因子。
人们通过这种方式得到很大的因素 根据我的经验,通话等级的数量可以轻松达到30或更多。 每个电话似乎都是必要的,直到你问是否可以避免。 即使是少量的可避免的呼叫,也可以在很多层上产生巨大的影响。
链接地址: http://www.djcxy.com/p/40347.html下一篇: gprof a library