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或更多。每个电话似乎必要的,直到你问是否可以避免。即使是少量的可避免的呼叫,也可以在很多层上产生巨大的影响。
我想你也应该提到你的平台:操作系统,编译器,gprof的版本等 – 2010-06-02 12:52:27
我发现这篇文章:也许这是一些使用的: http://unix.derkeiler.com/Newsgroups/comp.unix .programmer/2004-03/0938.html – LoudNPossiblyWrong 2010-06-02 12:57:12
您是否尝试过使用valgrind/kcachegrind来配置文件?我更喜欢它gprof。 – 2010-06-02 12:57:24