【发布时间】:2012-08-28 09:15:24
【问题描述】:
这两个 sn-ps 代码之间会有明显的速度差异吗?天真地,我认为第二个 sn-p 会更快,因为遇到的分支指令要少得多,但另一方面,分支预测器应该可以解决这个问题。还是尽管有可预测的模式,但它会产生明显的开销?假设没有使用条件移动指令。
片段 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;
}
我不打算自己优化这些案例,但我想更多地了解分支的开销,即使是可预测的模式。
【问题讨论】:
-
如果您的编译器执行循环取消切换,它们是相同的。
-
int val = a == 3 ? 1 : 0; for (int i = 0; i < 100; ++i) output[i] = val; -
它不会受到分支错误预测的影响,但无论如何它可能会受到重复分支的影响。要么,要么编译器是否为您进行优化都没有关系。检查装配以确保。
-
对于现代处理器上的 0 到 99 示例中的循环,即使没有优化,差异也会非常小。
标签: c++ performance optimization branch-prediction