我对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)对于第二个版本,如果我在循环上方评估和存储pq的结果,性能会提高吗,所以我可以用变量替换循环中的布尔表达式?

(3)我是否应该为此担心,或者分支预测(或其他优化方法)将确保循环中的布尔表达式几乎永远不会被求值?

最后,如果有人可以说出这3个问题的答案是否取决于体系结构,我将感到非常高兴。我对主要的Android NDK平台感兴趣:ARM,MIPS,x86等。在此先感谢您!

最佳答案

看来问题已经得到很好的解答,here:编译器可能会执行循环取消切换,从循环中删除条件,并自动生成3个循环副本,就像建议的stark一样。而且,从上面和上面给出的评论看来,分支预测对于此类循环非常有效。

关于c - 分支预测将对随后的C循环产生什么影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30535817/

10-11 23:19
查看更多