Performance 如何避免大部分未清除的条件分支?

Performance 如何避免大部分未清除的条件分支?,performance,if-statement,assembly,optimization,branch-prediction,Performance,If Statement,Assembly,Optimization,Branch Prediction,考虑以下情况: 在整个代码中,宏经常执行某些操作。(例如一些异常处理) 这个宏通常做的很少,但在某些情况下会周期性地出现,因此宏必须做更多的工作 这可以很容易地实现,使用条件分支来选择是需要复杂代码还是简单代码,如果需要复杂代码则使用分支。。。但这可能导致以下严重的性能问题: 许多现代分支预测器对多个分支使用相同的预测结构,因此从其他分支收集的数据会影响每个分支的预测!因此,大多数时间未使用的大量分支可能会“混淆”分支预测器,从而对其他分支做出可怕的预测 我怎样才能避开这个问题 注

考虑以下情况:

  • 在整个代码中,宏经常执行某些操作。(例如一些异常处理)

  • 这个宏通常做的很少,但在某些情况下会周期性地出现,因此宏必须做更多的工作

  • 这可以很容易地实现,使用条件分支来选择是需要复杂代码还是简单代码,如果需要复杂代码则使用分支。。。但这可能导致以下严重的性能问题:

    • 许多现代分支预测器对多个分支使用相同的预测结构,因此从其他分支收集的数据会影响每个分支的预测!因此,大多数时间未使用的大量分支可能会“混淆”分支预测器,从而对其他分支做出可怕的预测
我怎样才能避开这个问题

注意,因为复杂代码的调用非常少,所以我真的不关心这种情况下的效率


(研究的起点可能是:像java这样的语言是如何绕过这个问题的?

分支预测器通常会很好地识别几乎从未采用过的分支。我觉得你太担心这种情况了。我不知道。。。我的恐惧是基于我的工作方式。我认为如果你用从未执行过的树枝淹没它,它将变得毫无用处。。。我担心有很多预测因子都是一样的……也就是说,它会完美地识别这些分支,但会完全搞乱其余的分支。通常情况下,情况并非如此。分支预测器有足够的条目,很难将其与普通代码混淆。此外,除非相关代码很热门,否则偶尔的预测失误不太可能真的产生影响。@fuz:污染/稀释全球历史对于现代it-TAGE预测器(Haswell,Zen(?)来说似乎是一个合理的问题,其中预测的索引基于上一个
n
分支(如15到20?)的历史。但是我认为OP应该尝试用一个从未执行过的条件分支与一个普通的
nop
作为失败的最佳案例基线来测试一些实际案例。(或者只是一条针对指令长度填充的
cmp
指令,不使用
jcc
,以保持前端对齐与cmp/jcc附近的对齐方式相同。)可能没有那么糟糕。