为什么尽可能避免指令分支?

Joh*_*ell 7 cpu assembly programming-languages system

我经常读到,从一个perf的角度看,在汇编指令级别的分支是不好的.但我还没有真正理解为什么会这样.所以为什么?

Mar*_*ers 12

大多数现代处理器预取指令,甚至在代码流到达该指令之前推测性地执行它们.有一个分支意味着突然有两个不同的指令可能是下一条指令.至少有三种可能的方式可以与预取相互作用:

  • 分支后的指令不是预取的.该指令流水线变空,并且处理器必须等待的下一个指令是在最后时刻进账,让性能更差.
  • 处理器可以猜测将采用哪个分支(分支预测)并预取并执行适当的指令.如果它猜错了分支,它将不得不放弃完成的工作,并等待获取正确的指令.
  • 处理器可以获取并执行两个分支,然后丢弃未采用的分支的结果.

根据处理器和特定代码,与没有分支的等效代码相比,分支可能会或可能不会产生显着的性能影响.如果执行代码的处理器使用分支预测(大多数情况下)并且大部分正确猜测特定代码段,则可能不会对性能产生显着影响.另一方面,如果它大多猜错了,它可能会给你一个巨大的减速.

对于特定的代码段,很难预测删除分支是否会显着加快代码速度.当微观优化时,最好测量两种方法的性能而不是猜测.