背景
众所周知,随机分支会花费大量开销。 SO中有一个帖子回答了这样的问题。
在许多 CPU 架构中,跳转指令可以看到类似的性能影响。在 SO 中也有针对此类主题的帖子
因此,如果您使用诸如函数指针之类的编程模式或只是基于普通可继承 C++ 类的函数调用,我们必须付出分支未命中的代价。
即使对于最先进的硬件分支预测算法也只能进行基于全局共享地址历史的分支预测,并且可能会推测性地获取分支目标地址代码等。
但根据定义,它不适用于第一次执行。
许多嵌入式设备、智能手机等都需要在
- 开机时间
- 第一次执行像浏览器这样的应用程序
它调用了数百万个函数调用,并且可能不想显着改变软件架构,比如将所有间接跳转转换为直接跳转......
如果条件如下,
条件:
- 必须以最高速度运行
- 在第一次运行
或 - 跳跃对 cpu 来说看起来完全随机
- 在第一次运行
以下是最好的结果吗?
而且我想知道任何将动态/静态代码重写为间接跳转到直接跳转的示例。
如何获得最佳性能:
- 总是使用可能或不可能的分支
- 使用预链接
- 使用 mlock 或 readahead,cacheflush(ICACHE) 函数调用
- 将间接跳转动态或静态地重写为直接跳转
(发现 Bradley M Kuhn 在 1996 年写的一篇论文,用于某些情况下的静态重写)
我发现的论文是在源代码级别将虚拟函数调用转换为静态函数调用,但从软件开发人员的角度来看,二进制链接时间优化似乎更好。