使用gprof和sockets

5

我有一个程序想要使用gprof进行性能分析。问题是它使用了套接字。所以我会得到像这样的输出:

::select(): Interrupted system call

我曾经遇到过这个问题,但最终放弃了并继续前进。 但我真的很想能够使用gprof来分析我的代码。 我该怎么办? 是否有我忽略的gprof选项?套接字选项?在这些系统调用存在的情况下,gprof是否完全无用? 如果是这样,是否有可行的替代方案?
编辑:平台:
- Linux 2.6(x64) - GCC 4.4.1 - gprof 2.19

我认为你还应该提及你所使用的平台:操作系统、编译器、gprof 版本等。 - Cristian Ciupitu
2
我找到了这篇文章,也许对你有些帮助:http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2004-03/0938.html - LoudNPossiblyWrong
你尝试过使用 valgrind/kcachegrind 来进行性能分析吗?我更喜欢它比 gprof。 - NG.
@Cristian Ciupitu:好的观点,已完成。 - Chris Tonkinson
2个回答

5
套接字代码需要处理中断系统调用,无论是否使用分析器,但在使用分析器时,这是不可避免的。这意味着要编写如下代码。
if ( errno == EINTR ) { ...

每次系统调用后执行。

比如,你可以在这里了解更多相关背景知识。


好的,谢谢。跟进:https://dev59.com/Bk7Sa4cB1Zd3GeqP1S1v - Chris Tonkinson

1

gprof这里是论文)是可靠的,但它只是旨在测量变化,即使对于这一点,它也只能测量CPU绑定问题。它从未被宣传为有用于定位问题。这是其他人在其上添加的想法。

考虑这种方法

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

添加:如果我可以举个例子。假设你有一个调用层次结构,其中 Main 调用 A 多次,A 调用 B 多次,B 调用 C 多次,而 C 等待某个套接字或文件进行某些 I/O 操作,这基本上就是程序所做的所有事情。现在,进一步假设每个程序调用下一个程序的次数比实际需要的多 25%。由于 1.25^3 大约等于 2,这意味着整个程序运行时间是它实际需要的两倍。

首先,由于所有时间都花在等待 I/O 上,gprof 将无法告诉您如何花费这段时间,因为它只查看“运行”时间。

其次,假设(仅用于论证)它确实计算了 I/O 时间。它可能会给您提供一个调用图,基本上说每个程序占用 100% 的时间。那告诉你什么?没有比你已经知道的更多信息。

然而,如果你只取一小部分的堆栈样本,你会在每个样本中看到每个例程调用下一个例程的代码行。 换句话说,它不仅给出了大致的百分比时间估计,还指向了具有成本的特定代码行。 你可以查看每行代码并询问是否有方法可以减少它的使用次数。假设你这样做,你将获得两倍的速度提升。

人们通过这种方式获得了很大的优势。根据我的经验,调用级别的数量很容易达到30或更多。每个调用似乎都是必要的,直到你问它是否可以避免。即使是少量可避免的调用,在那么多层上也会产生巨大的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接