C中的内联实际上如何减慢这个程序的速度?

时间:2011-05-03 19:35:55

标签: c gcc compiler-construction compiler-optimization

为了强制功能不被内联消耗46%的运行时间,我在其上使用__attribute__((noinline))并使用gcc -Wall -Winline -O2编译代码(这些加-g是Makefile使用的东西 - 我也看到使用gcc 4.5.2时使用-g的效果大致相同。我发现具有非内联功能的程序比原始程序快20%以上。有谁知道为什么会这样?

让我提供一些更多细节。发生这种情况的程序是Linux的压缩实用程序bzip2的最新版本。程序中的关键功能(在compress.c中找到generateMTFValues)是执行Move To Front变换的功能。该函数仅由程序中的一个函数调用。

有没有人知道为什么程序在这种情况下运行得更快,因为强制编译器不要内联这个函数?该函数只接受一个参数 - 指向包含所有块和压缩信息的结构的指针。此外,它只调用另一个不会消耗任何实质处理时间的功能。

2 个答案:

答案 0 :(得分:6)

它可能会降低程序的速度,因为生成的代码更大,可能导致更多的CPU指令缓存丢失。

答案 1 :(得分:4)

这是一个基于近乎完美无知的完整WAG(Wild Ass Guess)。

对于内联版本,优化器是否真的忙于处理哪些值在哪些寄存器中?何时?如果是这种情况,过程调用版本可以为其提供更多的寄存器来处理循环中发生的事情。

正如我所说,只是一个WAG。