我所知道的唯一选择是将不太可能的分支移到函数的末尾。还有其他选择吗?
更新。 http://download.intel.com/products/processor/manual/325462.pdf 第2卷a,第2.1.1节说:
“分支提示前缀(2EH、3EH)允许程序向处理器提供有关分支的最可能代码路径的提示。只能将这些前缀与条件分支指令(Jcc)一起使用。在Intel 64或IA-32指令中,对分支提示前缀和/或其他未定义操作码的其他使用保留;这种使用可能会导致不可预测的行为。”
然而,我不知道这些是否实际上有任何影响。
另一方面,http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf 的3.4.1节说:
“编译器生成的代码可以提高Intel处理器中分支预测的效率。 Intel C ++编译器通过以下方式实现:
- 将代码和数据保留在不同的页面上
- 使用条件移动指令来消除分支
- 生成与静态分支预测算法一致的代码
- 适当时进行内联
- 如果迭代次数可预测,则展开循环
通过基于配置文件的优化,编译器可以布置基本块以消除函数最常执行路径上的分支或至少提高其可预测性。分支预测在源级别不需要考虑。有关更多信息,请参见Intel C ++编译器文档。”
http://cache-www.intel.com/cd/00/00/40/60/406096_406096.pdf在“使用PGO进行性能改进”中提到:
PGO最适用于具有许多难以在编译时预测的频繁执行分支的代码。例如,具有密集错误检查的代码,在其中大多数情况下错误条件都是错误的。可以将不经常执行(冷)的错误处理代码重新定位,使分支很少被错误地预测。将最小化插入频繁执行(热)代码的冷代码可改善指令缓存行为。