首页 > 解决方案 > 如果大多数功能都被扩展(例如内联),性能是否会受到明显的负面影响?

问题描述

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

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

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

“扩展”意味着每当一个函数被调用时,整个函数被放置到位,或者等效地创建一个新的函数副本(通过“函数扩展工具”静态地用于正常调用,或者动态地通过一些“函数扩展运行时”函数指针调用)并在那里调用。

很难为所有高级语言语法情况(例如 lambda/closure 等)定义“扩展”,并且“扩展”源代码的想象工具将很复杂。让我们假设现在只扩展易于扩展的函数调用,甚至可以假设所有代码都是用 C 编写的。显然递归调用不能扩展,也不属于关于如何扩展程序的讨论不是问题的重点。

我们还假设计算机有足够的主内存,因为 OS 和应用程序的扩展映像可能非常大,比如 1TB?

标签: cperformance

解决方案


编译器现在非常高效,编译器总是会做一种简单的“扩展”,如果构建不使用更小的文件大小优化,“扩展”的扩展也会增加。

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

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

编辑:

如此处所述,它可能会对性能产生负面影响:

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

但是我仍然认为在实际情况下它不会受到太大的伤害,除非系统内存太小以至于可执行文件大小的增加足以压倒内存。


推荐阅读