我对C的经验相对较少,而且我对现代CPU上的编译输出缺乏很好的理解。上下文:我正在为Android应用程序进行图像处理。我已经读过,无分支机器代码是内部循环的首选,所以我想知道这样的东西之间是否可能存在明显的性能差异:
if (p) { double for loop, computing f() }
else if (q) { double for loop, computing g() }
else { double for loop, computing h() }
与较为冗长的版本进行比较,后者在循环中进行条件检查:
for (int i = 0; i < xRes; i++)
{
for (int j = 0; j < yRes; j++)
{
image[i][j] = p ? f() : (q ? g() : h());
}
}
在此代码中,p和q是类似于
mode == 3
的表达式,其中mode
被传递到函数中,并且在函数中从未更改。我有三个简单的问题:(1)比第二个版本更冗长的第一个版本能否编译成更有效的代码?
(2)对于第二个版本,如果我在循环上方评估和存储
p
和q
的结果,性能会提高吗,所以我可以用变量替换循环中的布尔表达式?(3)我是否应该为此担心,或者分支预测(或其他优化方法)将确保循环中的布尔表达式几乎永远不会被求值?
最后,如果有人可以说出这3个问题的答案是否取决于体系结构,我将感到非常高兴。我对主要的Android NDK平台感兴趣:ARM,MIPS,x86等。在此先感谢您!
最佳答案
看来问题已经得到很好的解答,here:编译器可能会执行循环取消切换,从循环中删除条件,并自动生成3个循环副本,就像建议的stark一样。而且,从上面和上面给出的评论看来,分支预测对于此类循环非常有效。
关于c - 分支预测将对随后的C循环产生什么影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30535817/