c - 如果大多数功能都被扩展(例如内联),性能是否会受到明显的负面影响?
问题描述
函数的目的之一是代码重用。另一个可能的用途是节省程序内存,这也意味着考虑到 I-cache 和 L2+ 缓存占用以及指令获取占用的主内存带宽的性能。
出于好奇,问题是如果所有功能都“扩展”,日常软件(如整个操作系统加上许多应用程序,而不仅仅是一些小的基准测试代码)的性能是否会受到明显影响?主要是对缓存和主存指令带宽的影响。
影响可能不明显的原因是,对于那么多指令,它们被复制很多次或重复使用并不重要。事实也可能是局部性主要来自循环而不是函数调用。
“扩展”意味着每当一个函数被调用时,整个函数被放置到位,或者等效地创建一个新的函数副本(通过“函数扩展工具”静态地用于正常调用,或者动态地通过一些“函数扩展运行时”函数指针调用)并在那里调用。
很难为所有高级语言语法情况(例如 lambda/closure 等)定义“扩展”,并且“扩展”源代码的想象工具将很复杂。让我们假设现在只扩展易于扩展的函数调用,甚至可以假设所有代码都是用 C 编写的。显然递归调用不能扩展,也不属于关于如何扩展程序的讨论不是问题的重点。
我们还假设计算机有足够的主内存,因为 OS 和应用程序的扩展映像可能非常大,比如 1TB?
解决方案
编译器现在非常高效,编译器总是会做一种简单的“扩展”,如果构建不使用更小的文件大小优化,“扩展”的扩展也会增加。
根据我优化 C 代码的丰富经验,我认为如果在 OS 中使用它不会有明显的差异,但它在(例如)图像处理中非常有用。
这可以在 C 中使用宏而不是函数手动完成,这将在预处理期间扩展函数(在本例中为宏),这将导致更快的代码执行。
编辑:
如此处所述,它可能会对性能产生负面影响:
但是我仍然认为在实际情况下它不会受到太大的伤害,除非系统内存太小以至于可执行文件大小的增加足以压倒内存。
推荐阅读
- c - 对 char 数组结构成员进行类型双关
- powershell - 将逗号附加到字符串 Arraylist 中的每个元素
- python - SQLite 和 python - 无法设置主键
- python-3.x - os.walk() 不显示子文件夹的父文件夹
- xcode - 构建后无法撤消 xcode 更改
- javascript - 动态排序下拉列表中的对象数组
- django - 我的 Django 表单没有将我的图像添加到数据库中
- c# - 无法从 asp.net api 连接到 Mysql
- multidimensional-array - PHP按顺序打印另一个数组中的数组值
- javascript - 在 Google Apps 脚本中添加 Bootstrap 4 Searchable Dropdown