【问题标题】:Using gprof with sockets将 gprof 与套接字一起使用
【发布时间】:2011-02-26 19:36:19
【问题描述】:

我有一个程序要使用 gprof 进行分析。问题(似乎)是它使用套接字。所以我得到这样的东西:

::select(): Interrupted system call

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

编辑:平台:

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

【问题讨论】:

  • 我认为您还应该提及您的平台:操作系统、编译器、gprof 版本等。
  • 我找到了这篇文章:也许它有点用处:unix.derkeiler.com/Newsgroups/comp.unix.programmer/2004-03/…
  • 您是否尝试过使用 valgrind / kcachegrind 进行分析?我更喜欢它而不是 gprof。
  • @Cristian Ciupitu:好点;完成。

标签: c++ sockets profiling gprof


【解决方案1】:

socket代码需要处理中断的系统调用,不管profiler如何,但是在profiler下这是不可避免的。这意味着有类似的代码。

if ( errno == EINTR ) { ...

在每次系统调用之后。

看一下,例如,here 作为背景。

【讨论】:

【解决方案2】:

gprof (here's the paper) 是可靠的,但它是 only was ever intended to measure changes,即便如此,它也只能测量 CPU 密集型问题。它从未被宣传用于定位问题。这是其他人在其上叠加的想法。

考虑this method

如果您不介意花点钱,另一个不错的选择是Zoom

补充:如果我能给你举个例子。假设你有一个调用层次结构,其中 Main 调用 A 一些次,A 调用 B 一些次,B 调用 C 一些次,C 等待一些带有套接字或文件的 I/O,基本上就是这样该程序确实如此。现在,进一步假设每个例程调用下一个例程的次数比实际需要的次数多 25%。由于 1.25^3 大约是 2,这意味着整个程序的运行时间是实际需要的两倍。

首先,由于所有时间都花在等待 I/O 上,因此 gprof 不会告诉您该时间是如何花费的,因为它只查看“运行”时间。

其次,假设(仅作为参数)它确实计算了 I/O 时间。它可以给你一个调用图,基本上说每个例程都占用了 100% 的时间。这告诉你什么?没有什么比你已经知道的更多了。

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

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

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2016-02-18
    • 2012-08-09
    相关资源
    最近更新 更多