我有一个程序我想用gprof来描述。问题(似乎)是它使用套接字。所以我得到了这样的东西:
::select(): Interrupted system call一段时间前,我遇到了这个问题,放弃了,然后继续前进。但是如果可能的话,我非常希望能够使用gprof来分析我的代码。我能做什么?我错过了什么选择吗?套接字选项?在这种类型的系统调用存在的情况下,gprof完全无用吗?如果是的话,是否有可行的选择?
编辑:平台:
发布于 2010-06-02 13:06:19
套接字代码需要处理中断的系统调用,而不管分析器是什么,但是在分析器下,这是不可避免的。这意味着有类似的代码。
if ( errno == EINTR ) { ...每次系统呼叫之后。
看一看,例如,背景是这里。
发布于 2010-06-02 15:17:41
gprof (这是报纸)是可靠的,但是它是唯一的目的是测量变化,即使是这样,它也只测量CPU绑定的问题。它从来没有被宣传是有用的定位问题。这是一个其他人在上面分层的想法。
考虑一下这种方法。
另一个不错的选择,如果你不介意花一些钱,是缩放。
补充道:如果我能给你举个例子的话,那就是。假设您有一个调用层次结构,其中主调用A几次,A调用B一些次数,B调用C一些次数,C使用一个套接字或文件等待一些I/O,这基本上就是程序所做的一切。现在,进一步假设每个例程调用下一个例程的次数比实际需要的次数多25%。因为1.25^3大约是2,这意味着整个程序运行所需的时间是实际需要的两倍。
首先,由于所有的时间都用于等待I/O,gprof将不会告诉您如何花费时间,因为它只关注“运行”时间。
第二,假设(只是为了论证)它确实计算了I/O时间。它可以给你一个呼叫图,基本上说,每个例程花费100%的时间。那能告诉你什么?没有什么比你已经知道的了。
但是,如果您取了少量的堆栈示例,您将在每个堆栈上看到每个例程调用下一个例程的代码行。换句话说,它不仅给出了粗略的百分比时间估计,而且还指出了代价高昂的特定代码行。您可以查看每一行代码,并询问是否有一种方法可以减少次数。假设你这样做,你将得到2加速比的因子。
人们通过这种方式得到了很大的因素。根据我的经验,呼叫级别的数目可以很容易地达到30或更多。每个电话似乎都是必要的,直到你问它是否可以避免。即使是少量的可避免的呼叫也会对这许多层产生巨大的影响。
https://stackoverflow.com/questions/2957759
复制相似问题