使用gprof与套接字

我有一个我想用gprof进行配置的程序。 问题(表面上)是它使用套接字。 所以我得到这样的东西:

::select(): Interrupted system call

我一会儿回到这个问题,放弃了,然后继续前进。 但我真的很想能够剖析我的代码,如果可能,请使用gprof。 我能做什么? 有没有我错过的gprof选项? 套接字选项? 在这些类型的系统调用中gprof是完全无用的吗? 如果是这样,是否有一个可行的选择?

编辑:平台:

  • Linux 2.6(x64)
  • GCC 4.4.1
  • gprof 2.19

  • 无论分析器如何,套接字代码都需要处理中断的系统调用 ,但在剖析器中它是不可避免的。 这意味着有类似的代码。

    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

    上一篇: Using gprof with sockets

    下一篇: gprof a library