6

我正在使用 google 的 perftools ( http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html ) 进行 CPU 分析——这是一个很棒的工具,它帮助我执行了大量的 CPU 时间我的应用程序的改进。

不幸的是,我已经明白代码仍然有点慢,并且当使用 g++ 的 -O3 优化级别编译时,我只知道特定函数很慢,但不知道它的哪些方面很慢。

如果我删除 -O3 标志,则程序的未优化部分会超过此函数,并且我不会很清楚地了解函数中缓慢的实际部分。如果我保留 -O3 标志,那么函数的慢部分会被内联,我无法确定函数的哪些部分是慢的。

有什么建议么?谢谢你的帮助!

4

3 回答 3

6

对于这样的事情,我一直使用“老派”的方式来做这件事:

将测量当前时间(或 cputime)的语句插入到您要在各个点测量的例程中。然后只需打印或记录它们之间的差异,您就会知道每段代码花费了多长时间。从那里您可以找出大部分时间在吃什么,然后进入该部分并获得细粒度的时间,直到您知道问题是什么以及如何解决它。

如果函数调用的开销不是问题,您还可以强制内联关闭-fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline(我不确定这些开关如何相互交互,但我认为它们是独立的)。然后您可以使用您的普通分析器查看调用图配置文件并查看哪些函数调用花费了多少时间。

于 2009-04-08T17:16:21.900 回答
5

如果您使用的是 linux,请使用oprofile。如果您使用的是 Windows,请使用 AMD 的CodeAnalyst

两者都将基于样本的配置文件提供到单个源代码行或汇编指令的级别,并且您应该可以毫无问题地识别函数中的“热点”。

于 2009-04-08T21:19:27.557 回答
1

我花了几十年的时间进行性能调优。

人们喜欢他们的工具,但我发誓这种方法

于 2009-04-10T18:35:01.043 回答