C语言 如果大多数函数被扩展(例如内联),性能是否会受到明显的负面影响?



函数的一个目的是代码重用。另一个可能的用法是节省程序内存,这也意味着考虑I-cache和L2+ cache占用和指令抓取占用的主内存带宽的性能。

出于好奇,问题是,如果所有功能都"扩展",日常软件(如整个操作系统加上许多应用程序,而不仅仅是一些小的基准代码)的性能是否确实会受到明显影响?它主要是关于对缓存和主存指令带宽的影响。

影响的原因可能并不明显对于这么多的指令,它们被复制很多次或重复使用并不重要。事实上,局部性可能主要来自循环,而不是函数调用。

"expand"意味着无论何时调用函数,整个函数都被放置到位,或者等效地创建函数的新副本(由"函数扩展工具"静态地创建);用于正常调用,或动态地由某些扩展运行时的函数调用。对于函数指针调用),并在那里调用。

"expand"很难为所有高级语言语法情况(如lambda/闭包等)和想象中的"扩展"工具定义。源代码将是复杂的。现在让我们假设只有那些易于展开的函数调用才能展开,甚至可以假设所有的代码都是用c编写的。显然,递归调用不能展开,否则就会陷入讨论如何展开程序的讨论中,这不是问题的重点。

让我们假设计算机有足够的主存,因为操作系统加上应用程序的扩展映像可能相当大,比如1TB?

现在的编译器非常高效,一种简单的"扩展"总是会被编译器做"扩展",也会被扩展"扩张"。如果构建没有针对较小的文件大小进行优化,则会增加。

根据我丰富的优化C代码的经验,我不认为如果在操作系统中使用会有明显的差异,但它在(例如)图像处理中非常有用。

这可以在C中使用宏而不是函数手动完成,这将在预处理期间扩展函数(在本例中是宏),从而导致更快的代码执行。

编辑:

它可能会对性能产生负面影响,正如这里所提到的:

  1. Linux内核编码风格文档
  2. 内联函数c++

,但是,我认为在实际情况下,它不会造成那么大的损害,除非系统内存非常小,以至于可执行文件大小的增加足以压倒内存。

最新更新