背景
众所周知,随机分支的开销很大。 And there was a post in SO answering such question.如何优化由cpu分支遗漏放慢的跳转指令?
许多CPU体系结构中的跳转指令可以看到类似的性能影响。 And there was a post in SO for such theme as well
所以,如果你使用的函数指针或只是普通的可继承的基于C++类的函数调用的编程模式,我们必须支付分支未命中的代价。
即使是最先进的硬件分支预测算法也只能做全局共享地址历史的分支预测,也许它可能会推测性地获取分支目标地址代码等等。
但是根据定义,它不适用于第一次执行。
许多嵌入式设备,智能手机等应
- 开机时间要求最高性能
- 像浏览器的应用程序的第一次执行
其中要求数以百万计的函数调用和可能不希望以显着改变那里的软件体系结构,如将所有间接跳转转换为直接跳转...
如果cond itions如下所示,
条件:
- 必须以最快的速度
- 在第一次运行
或 - 跳跃看起来完全随机的CPU
运行
- 在第一次运行
是否跟随最好的结果是什么?
我想知道任何动态/静态代码重写间接直接跳转的例子。
如何获得最大的性能:
- 始终使用任一分支可能或不可能
- 使用预链接
- 使用m锁或预读,cacheflush(ICACHE)函数调用
- 改写间接跳转至直接跳转动态或静态
(found a paper written in 1996 by Bradley M Kuhn用于某些情况下的静态重写)
我发现的论文是将虚拟函数调用转换为源代码级别的静态函数调用,但对于软件开发人员来说,二进制链接时间优化似乎更好。
嗯,没有,有就无条件跳转没有可能的分支预测错误惩罚。 –
这是不是很清楚你真的问。但也许你正在寻找手动插入分支预测器提示?这些是不可移植的,但是你可以在某些平台上使用诸如'likely()或'unlikely()'等宏。 – TJD
@HansPassant,你忘了“直接”。您可能会对无条件的间接跳转进行误预测。 – AProgrammer