在循环分支预测性能(Performance of branch prediction in a lo

2019-07-31 08:01发布

会不会有代码这两个片段之间的任何明显的速度差异? 天真,我认为第二个片段会更快,因为分支指令遇到少了很多,但在另一方面,分支预测应该解决这个问题。 还是会具有尽管预测的模式有明显的开销? 假设没有条件移动指令使用。

片段1:

for (int i = 0; i < 100; i++) {
    if (a == 3)
        output[i] = 1;
    else
        output[i] = 0;
}

片段2:

if (a == 3) {
    for (int i = 0; i < 100; i++)
        output[i] = 1;
} else {
    for (int i = 0; i < 100; i++)
        output[i] = 0;
}

我不打算优化这些情况我自己,但我想知道更多关于分支机构的开销,甚至可预测的模式。

Answer 1:

由于a ,一旦你进入循环保持不变 ,不应该有两个代码段太大的区别。

就个人而言,我宁愿是前者,除非分支预测失败预测分支这实在不太可能的,因为a保留在循环不变。

此外,编译器可以执行这种优化:

  • 循环外

从而使得这两种代码段发射完全相同的机器指令。



Answer 2:

你问一个问题的表现没有指定硬件(尽管从问题中我们可以推断,它是具有分支预测结构中的一种),工具链,或编译选项。

总体而言,这仅仅是另一个空间VS速度的权衡,在空间往往本身会影响速度(CPU指令和微码缓存)。

唯一合理的答案是“ 实际性能取决于处理器硬件和编译器优化而有所不同。”



文章来源: Performance of branch prediction in a loop