我正在使用google的perftools(http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html)进行CPU分析 - 这是一个很棒的工具,它帮助我在应用程序上执行了大量的CPU时间改进。
不幸的是,我已经明白代码仍然有点慢,而且当使用g ++的-O3优化级别进行编译时,我所知道的是特定的函数很慢,但不是它的哪些方面很慢。
如果我删除-O3标志,那么程序的未优化部分超过了这个功能,而且我对功能的实际部分很清楚。如果我留下-O3标志,那么函数的慢速部分是内联的,我无法确定函数的哪些部分很慢。
有什么建议吗?谢谢你的帮助!
答案 0 :(得分:6)
对于这样的事情,我总是用“老派”的方式来做这件事:
在测量当前时间(或cputime)的各个点语句中插入要测量的例程。然后只需打印或记录它们之间的差异,您就会知道每段代码花了多长时间。从那里你可以找到大部分时间吃的东西,然后进入并在该部分内获得细粒度的时间,直到你知道问题是什么,以及如何解决它。
如果函数调用的开销不是问题,你也可以用-fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline
强制内联关闭(我不确定这些开关如何相互作用,但我认为它们是独立的)。然后,您可以使用普通的分析器查看调用图配置文件,看看哪些函数调用花费了多少时间。
答案 1 :(得分:5)
如果您使用的是Linux,请使用oprofile。 如果您使用的是Windows,请使用AMD的CodeAnalyst。
两者都会将基于样本的配置文件降低到单个源代码行或汇编指令的级别,您应该没有问题识别函数中的“热点”。
答案 2 :(得分:1)
我花了数十年时间进行性能调整。
人们喜欢他们的工具,但我发誓this method。