这两段代码之间会有明显的速度差异吗?天真地,我认为第二个片段会更快,因为分支指令遇到的要少得多,但另一方面,分支预测器应该解决这个问题。或者尽管有可预测的模式,它会有明显的开销吗?假设没有使用条件移动指令。
代码段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;
}
我不打算自己优化这些案例,但我想更多地了解分支的开销,即使是可预测的模式。
答案 0 :(得分:3)
由于a
在进入循环后仍保持不变,因此两个代码段之间应该没有太大区别。
就个人而言,我更喜欢前者,除非分支预测器无法预测真正不可能的分支,因为a
在循环中保持不变。
此外,编译器可以执行此优化:
从而使两个代码片段发出完全相同的机器指令。
答案 1 :(得分:1)
您在没有指定硬件的情况下询问了性能问题(尽管我们可以推断出这是一个具有分支预测的架构),工具链或编译选项。
总的来说,这只是另一个空间与速度的权衡,其中空间本身通常会影响速度(CPU指令和微码缓存)。
唯一合理的答案是“性能会因处理器硬件和编译器优化而异。”