C++ 环路中的分支预测性能

C++ 环路中的分支预测性能,c++,performance,optimization,branch-prediction,C++,Performance,Optimization,Branch Prediction,这两段代码之间会有明显的速度差异吗?天真地说,我认为第二个代码段会更快,因为遇到的分支指令要少得多,但另一方面,分支预测器应该可以解决这个问题。或者,尽管有可预测的模式,它会有明显的开销吗?假设未使用条件移动指令 片段1: for(int i=0;i

这两段代码之间会有明显的速度差异吗?天真地说,我认为第二个代码段会更快,因为遇到的分支指令要少得多,但另一方面,分支预测器应该可以解决这个问题。或者,尽管有可预测的模式,它会有明显的开销吗?假设未使用条件移动指令

片段1:

for(int i=0;i<100;i++){
如果(a==3)
输出[i]=1;
其他的
输出[i]=0;
}
片段2:

if(a==3){
对于(int i=0;i<100;i++)
输出[i]=1;
}否则{
对于(int i=0;i<100;i++)
输出[i]=0;
}

我不打算自己优化这些情况,但我想知道更多关于分支的开销的信息,即使是在可预测的模式下。

因为
a
在进入循环后保持不变,所以这两个代码片段之间应该没有太大区别

就个人而言,我更喜欢前者,除非分支预测器无法预测分支,因为
a
在循环中保持不变,这是不太可能的

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


因此,使两个代码段发出完全相同的机器指令。

您提出了一个性能问题,但没有指定硬件(尽管从这个问题我们可以推断它是具有分支预测、工具链或编译选项的体系结构之一)

总的来说,这只是另一种空间与速度的权衡,空间本身往往会影响速度(CPU指令和微码缓存)


唯一合理的答案是“性能将根据处理器硬件和编译器优化而变化。

如果编译器执行循环取消切换,它们是相同的。
int val=a==3?1 : 0; 对于(int i=0;i<100;++i)输出[i]=val它不会受到分支预测失误的影响,但它可能会受到重复分支的影响。要么这样,要么编译器为您进行优化都无关紧要。检查程序集以确保。对于现代处理器上的0到99这样的循环,即使没有优化,差异也非常小。
for (int i = 0; i < 100; i++) {
    if (a == 3)
        output[i] = 1;
    else
        output[i] = 0;
}
if (a == 3) {
    for (int i = 0; i < 100; i++)
        output[i] = 1;
} else {
    for (int i = 0; i < 100; i++)
        output[i] = 0;
}