我经常读到,从性能的角度来看,分支很糟糕,有点在汇编指令级别,很糟糕。但我还没有真正明白为什么会这样。所以为什么?
最佳答案
大多数现代处理器会在代码流到达该指令之前执行 prefetch 指令,甚至 speculatively execute 指令。有一个分支意味着突然有两条不同的指令可能是下一条指令。至少有三种可能的方式可以与预取交互:
根据处理器和特定代码,与没有分支的等效代码相比,分支可能会也可能不会产生显着的性能影响。如果执行代码的处理器使用分支预测(大多数都这样做)并且主要针对特定代码段进行正确猜测,则可能不会对性能造成重大影响。另一方面,如果它主要猜测不正确,则可能会大大减慢速度。
对于特定的代码段,很难预测删除分支是否会显着加快代码速度。在进行微优化时,最好测量两种方法的性能而不是猜测。