大家,我正在运行 gprof 来检查两个不同优化级别(-g -pg 与 -O3 -pg)的执行时间百分比。
所以我得到的结果是,一个函数在 O3 中占用了 68% 的 exc-time,但在 -g 版本中只占用了 9%。
我不确定如何找出其背后的原因。我正在考虑在编译之前比较两个版本文件,但我不确定 cmd 是否可以这样做。
有没有其他方法可以找出这个执行时间差异的原因。
大家,我正在运行 gprof 来检查两个不同优化级别(-g -pg 与 -O3 -pg)的执行时间百分比。
所以我得到的结果是,一个函数在 O3 中占用了 68% 的 exc-time,但在 -g 版本中只占用了 9%。
我不确定如何找出其背后的原因。我正在考虑在编译之前比较两个版本文件,但我不确定 cmd 是否可以这样做。
有没有其他方法可以找出这个执行时间差异的原因。
当您使用优化标志时,您必须小心解释 gprof/profiling 结果。使用 -O3 编译确实可以改变代码的结构,因此 gprof 无法判断在哪里花费了多少时间。
特别是,启用更高优化级别的函数内联使得您的某些函数将完全被内联代码替换,因此它们似乎根本不需要任何时间。然后将花费在这些子函数中的时间归因于调用它们的父函数,因此看起来在给定父函数中花费的时间实际上增加了。
我找不到一个很好的参考。这是一个旧的例子:
http
://gcc.gnu.org/ml/gcc/1998-04/msg00591.html
话虽如此,当使用-O3 运行gprof 时,我会预料到这种奇怪的行为。我总是只使用 -O1 优化来进行分析,以尽量减少这些影响。
我认为您的推理存在一个根本缺陷:优化版本中执行时间的 68% 与未优化版本中的 9% 相比,这意味着未优化版本的性能更好。
相反,我很确定 -O3 版本在绝对值上表现更好,但优化器在其他功能上做得更好,因此,与优化代码的其余部分成比例,给定的子例程结果较慢 -但它实际上比未优化的版本更快 - 或者至少一样快。
不过,要直接检查发出的代码中的差异,您可以使用-S
开关。另外,为了看看我的想法是否正确,您可以粗略地比较 -O0 与 -03 中的函数所花费的 CPU 时间,将该百分比乘以您的程序所花费的用户时间,该命令提供的命令如下time
(另外,我很确保您可以获得在 gprof 中的子例程中花费的绝对时间的度量,IIRC 甚至在默认输出中也是如此)。