如果使用 __INLINE__ 速度会提高多少?

Mar*_*ark 0 c linux gcc

据我了解,INLINE可以加快代码执行速度,是吗?

我们可以从中获得多少速度?

And*_*ovs 6

这里撕下来:

\n\n

是和不是。有时。或许。

\n\n

没有简单的答案。内联函数可能会使代码更快,也可能会使代码变慢。他们可能会使可执行文件变大,也可能使其变小。它们可能会导致颠簸,也可能会阻止颠簸。它们可能而且经常与速度完全无关。

\n\n

内联函数可能会使速度更快:如上所示过程集成可能会删除一堆不必要的指令,这可能会使事情运行得更快。

\n\n

内联函数可能会使其变慢:过多的内联可能会导致代码膨胀,这可能会导致按需分页虚拟内存系统的“颠簸”。换句话说,如果可执行文件太大,系统可能会花费大部分时间到磁盘来获取下一个代码块。

\n\n

内联函数可能会使它变得更大:这是代码膨胀的概念,如上所述。例如,如果系统有 100 个内联函数,每个函数扩展为 100 个字节的可执行代码并在 100 个位置调用,则增加了 1MB。1MB 会引起问题吗?谁知道呢,但最后 1MB 可能会导致系统“崩溃”,从而减慢速度。

\n\n

内联函数可能会使其更小:与内联扩展函数体相比,编译器通常会生成更多代码来推送/弹出寄存器/参数。这种情况发生在非常小的函数上,当优化器能够通过过程集成 \xe2\x80\x94 删除大量冗余代码时,即优化器能够使大函数变小时,也会发生在大函数上。

\n\n

内联函数可能会导致抖动:内联可能会增加二进制可执行文件的大小,这可能会导致抖动。

\n\n

内联函数可能会防止抖动:即使可执行文件大小增加,工作集大小(一次需要在内存中的页数)也可能会下降。当 f() 调用 g() 时,代码通常位于两个不同的页面上;当编译器在程序上将 g() 的代码集成到 f() 中时,这些代码通常位于同一页上。

\n\n

内联函数可能会增加缓存未命中的次数:内联可能会导致内部循环跨越内存缓存的多行,这可能会导致内存缓存的抖动。

\n\n

内联函数可能会减少缓存未命中的数量:内联通常会提高二进制代码内引用的局部性,这可能会减少存储内部循环代码所需的缓存行数。这最终可能会导致 CPU 密集型应用程序运行得更快。

\n\n

内联函数可能与速度无关:大多数系统不受 CPU 限制。大多数系统都是 I/O 密集型、数据库密集型或网络密集型,这意味着系统整体性能的瓶颈是文件系统、数据库或网络。除非您的“CPU 计量器”固定在 100%,否则内联函数可能不会让您的系统变得更快。(即使在受 CPU 限制的系统中,内联也只有在瓶颈本身内使用时才会有帮助,而且瓶颈通常只存在于一小部分代码中。)

\n\n

没有简单的答案:你必须尝试一下才能知道什么是最好的。不要满足于简单化的答案,例如“从不使用内联函数”或“始终使用内联函数”或“当且仅当函数少于 N 行代码时才使用内联函数”。这些一刀切的规则可能很容易写下来,但它们会产生次优的结果。

\n\n

版权所有 (C) 马歇尔·克莱恩

\n