代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

使用带插座的gprof

  •  5
  • Chris Tonkinson  · 技术社区  · 14 年前

    我有一个程序,我想和gprof一起分析。问题(表面上)是它使用了套接字。所以我得到这样的东西:

    ::select(): Interrupted system call
    

    不久前我遇到了这个问题,放弃了,继续前进。但我真的希望能够分析我的代码,如果可能的话,使用gprof。我能做什么?我有没有找不到的gprof选项?插座选项?在存在这些类型的系统调用时,gprof是否完全无用?如果是这样,是否有可行的替代方案?

    编辑: 平台:

    • Linux 2.6(X64)
    • GCC 4.4.1
    • GPROF 2.19
    2 回复  |  直到 14 年前
        1
  •  5
  •   Nikolai Fetissov    14 年前

    套接字代码需要处理 中断的系统调用 不管分析器是什么,但是在分析器下是不可避免的。这意味着拥有类似代码。

    if ( errno == EINTR ) { ...
    

    每次系统调用后。

    举个例子, here 作为背景。

        2
  •  1
  •   Community Dan Abramov    7 年前

    GPROF ( here's the paper )是可靠的,但是 only was ever intended to measure changes 即使如此,它也只测量CPU绑定的问题。它从未被宣传过对 定位问题 . 这是一个想法,其他人在它上面分层。

    考虑 this method .

    另一个好的选择是,如果你不介意花点钱的话, Zoom .

    补充: 如果我能举个例子。假设您有一个调用层次结构,其中main调用若干次,a调用b若干次,b调用c若干次,c用套接字或文件等待一些I/O,这基本上就是程序所做的一切。现在,进一步假设每个例程调用下一个例程的次数比实际需要的次数多25%。因为1.25^3大约是2,这意味着整个程序的运行时间是实际需要的两倍。

    首先,因为所有的时间都花在等待I/O上,gprof不会告诉您如何花费时间,因为它只关注“运行”时间。

    第二,假设 计算I/O时间。它可以给你一个调用图,基本上说每个例程需要100%的时间。这告诉你什么?你已经知道了。

    但是,如果您获取少量的堆栈示例,您将在每个示例上看到每个例程调用下一个示例的代码行。 换句话说,这不仅仅是给你一个粗略的时间百分比估计,而是 将您指向特定的代码行,这些代码行成本高昂 . 您可以查看每一行代码,并询问是否有方法减少执行次数。假设你这样做,你会得到2的加速系数。

    人们通过这种方式得到大的因素。根据我的经验,呼叫级别的数量可以轻松达到30个或更多。每次通话 似乎 必要的,直到你问是否可以避免。即使是少量的可避免调用也会对许多层产生巨大的影响。