为什么强制内联函数会导致性能不佳
Why can forced inline functions lead to bad performance?
如果我内联一个函数。函数调用体将被复制,而不是向其发出 call()。为什么这会导致性能不佳?
编辑:那么由于大功能而导致缓存未命中呢?那么为什么存在"最多 3 行的内联函数"的经验法则呢?
可能存在一种边缘情况,即内联函数可能会增加程序大小或移动程序的位,以便缓存未命中发生在以前没有的地方。这并不常见,因为缓存旨在处理最常见的情况,并且与大多数热点相比相当大。
现代C++编译器中没有强制内联函数的标准方法,所以这是一个有争议的问题。 但是,假设您使用特定于编译器的功能来强制内联(并且编译器不会忽略它),它不会导致性能不佳,但由于存在更多相同代码的副本,它会导致可执行文件大小增加。
编辑:根据下面的评论,应该提到的是,确实存在一个非常不可能的边缘情况,即您的代码可能会在近距离执行同一内联函数的不同副本,从而降低指令缓存的效率。 这将对性能产生可衡量影响的可能性极小,但在某些边缘情况下,它可以。
我们应该退后一步,尝试解释CPU是如何工作的。通常它们有不同的缓存,一个用于代码,它告诉 CPU 执行所需的指令,另一个用于应用操作的数据。
数据缓存未命中"容易"解决,尝试使用尽可能小的数据结构,将您更频繁访问的成员放在一起......
指令缓存未命中更难理解和解决,这也是人们普遍认为C++中的多态行为比正常函数调用慢的原因。基本上,CPU 会在其缓存中预取存储在您尝试执行的执行点附近的指令,如果所有内容都是内联的,则只会有更多的数据,并且它将无法预取所有内容,从而导致缓存未命中。请注意,这只是一个简单的情况,根据我的经验,我在模板实例化方面遇到了问题,这些实例化会生成大量代码,导致性能比简单的虚拟调用和不太深的对象层次结构慢。
正如Alexandrescu经常指出的那样,你应该始终对代码进行计时。
源:每个程序员都应该知道的关于内存的知识
- 如何比较两个函数的速度和性能
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 函数局部静态变量:从性能角度来看的优点/缺点
- C++ 将函数指针与最佳性能相结合
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 虚拟函数调用的性能作为 for 循环中的上限
- 如何提高对 std::函数侦听器的分发性能?
- 性能函数调用与乘以 1
- std::函数有性能问题,如何避免?
- isspace 函数的性能警告,从 int 转换为布尔值
- C++函数名称对于性能来说太长
- 性能 - 使用字符串构造函数与使用串联
- if-else 与三元函数调用性能
- 加快 R 性能或将 R 函数转换为C++函数
- 递归函数和性能在C++
- 性能:否则如果 vs if 在已经返回的函数中
- C++构造函数性能
- 每帧的性能函数调用