我经常读到,从性能的角度来看,分支很糟糕,有点在汇编指令级别,很糟糕。但我还没有真正明白为什么会这样。所以为什么?

最佳答案

大多数现代处理器会在代码流到达该指令之前执行 prefetch 指令,甚至 speculatively execute 指令。有一个分支意味着突然有两条不同的指令可能是下一条指令。至少有三种可能的方式可以与预取交互:

  • 不预取分支后的指令。 instruction pipeline 变空,处理器必须等待,因为在最后一刻提取下一条指令,从而降低性能。
  • 处理器可以猜测将采用哪个分支( branch prediction )并预取并执行适当的指令。如果它猜测到错误的分支,它将不得不放弃已完成的工作,并等待获取正确的指令。
  • 处理器可以获取并执行两个分支,然后丢弃未采用的分支的结果。

  • 根据处理器和特定代码,与没有分支的等效代码相比,分支可能会也可能不会产生显着的性能影响。如果执行代码的处理器使用分支预测(大多数都这样做)并且主要针对特定​​代码段进行正确猜测,则可能不会对性能造成重大影响。另一方面,如果它主要猜测不正确,则可能会大大减慢速度。

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

    10-08 08:11
    查看更多