programming-languages - 为什么尽可能避免指令分支是好的?

标签 programming-languages assembly system cpu

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

最佳答案

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

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

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

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

    关于programming-languages - 为什么尽可能避免指令分支是好的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5662261/

    相关文章:

    c# - 学C#转C/C++?

    php - 保护脚本语言源代码

    perl - Perl 的 `system` 不等待完成如何进行。

    linux - 用于连接 SSH Ubuntu 18.04 的多个 key 。如何使用?

    windows - Windows、Mac OS X 和 Linux 是用什么语言编写的?

    assembly - 如何使用NASM访问系统时间?

    c - main函数和其他函数局部变量的区别

    c - C中是否有旋转操作

    perl - 如何将 Perl 的系统函数输出存储到变量中?

    programming-languages - 什么(仅有)仅通过引用的语言?