在讨论过程中,开发人员告知
- 可能/不太可能进行 gcc 优化
- 将最常见的分支放在代码中
在英特尔处理器上没有任何影响,应被忽略。所述原因是英特尔采用的动态分支预测。 我有 2 个问题,我找不到明确的答案:
- 分支预测数据是处理器(核心)全局的还是每个进程的?
- 如果是每个进程。分支目标缓冲区的结果是在整个进程存在期间保存的,还是在进程使用其时间片和指令缓存时闪烁,并且指令缓存被刷新或移动到另一个核心?
假设:
- Linux
- Skylake 英特尔处理器
- 在一个核心上运行多个独立的进程。
最佳答案
可能/不可能的优化与分支预测无关。
当英特尔处理器遇到条件分支时,如果不采取该分支,速度最快。在简单的 if/else 语句中,条件分支后面将跟有 if 语句。因此,如果 99% 的时间都执行 else 语句,那么这并不是最佳选择。编译器会将 if (condition) ifbranch else elsebranch 替换为 if (!condition) elsebranch else ifbranch,因此大多数情况下不会采用分支(如果这就是可能/不可能的优化告诉您的情况)。
或者考虑一个平均执行次数少于一次的循环(例如,只有百分之一)。通常编译器会提取 l 循环中与 oop 无关的代码。如果循环从未执行过,那就是浪费时间!您可以告诉编译器该循环很可能不会被执行,并且与循环无关的代码将不会被提取。
换句话说,开发者不知道他在说什么。也就是说,我们谈论的是一种很少有用的微观优化,就像所有微观优化一样,但这并不意味着它不起作用。
分支优化是针对每个处理器的。没有任何内容被刷新或存储和恢复。
关于c++ - 流程使用其时间片后是否保存分支预测器结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117543/