首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带套接字的gprof

使用带套接字的gprof
EN

Stack Overflow用户
提问于 2010-06-02 12:46:31
回答 2查看 1.4K关注 0票数 5

我有一个程序我想用gprof来描述。问题(似乎)是它使用套接字。所以我得到了这样的东西:

代码语言:javascript
复制
::select(): Interrupted system call

一段时间前,我遇到了这个问题,放弃了,然后继续前进。但是如果可能的话,我非常希望能够使用gprof来分析我的代码。我能做什么?我错过了什么选择吗?套接字选项?在这种类型的系统调用存在的情况下,gprof完全无用吗?如果是的话,是否有可行的选择?

编辑:平台:

  • Linux2.6 (x64)
  • GCC 4.4.1
  • gprof 2.19
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-02 13:06:19

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

代码语言:javascript
复制
if ( errno == EINTR ) { ...

每次系统呼叫之后。

看一看,例如,背景是这里

票数 5
EN

Stack Overflow用户

发布于 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或更多。每个电话似乎都是必要的,直到你问它是否可以避免。即使是少量的可避免的呼叫也会对这许多层产生巨大的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2957759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档