分支预测对后续C循环有什么影响?

时间:2015-05-29 17:38:23

标签: c android-ndk compiler-optimization micro-optimization branch-prediction

我对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)我是否应该担心这一点,或者分支预测(或其他一些优化)是否确保循环中的布尔表达式几乎从未被评估过?

最后,如果有人能说出这三个问题的答案是否取决于架构,我会很高兴。我对主要的Android NDK平台感兴趣:ARM,MIPS,x86等。我提前感谢!

1 个答案:

答案 0 :(得分:0)

看起来这个问题已经得到了很好的解答here:编译器可能会执行 loop unswitching ,从循环中删除条件并自动生成3个循环副本,就像{ {3}}建议。此外,根据那里及以上的评论,分支预测似乎对这些循环非常有效。