我对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)我是否应该担心这一点,或者分支预测(或其他一些优化)是否确保循环中的布尔表达式几乎从未被评估过?
最后,如果有人能说出这三个问题的答案是否取决于架构,我会很高兴。我对主要的Android NDK平台感兴趣:ARM,MIPS,x86等。我提前感谢!
答案 0 :(得分:0)
看起来这个问题已经得到了很好的解答here:编译器可能会执行 loop unswitching ,从循环中删除条件并自动生成3个循环副本,就像{ {3}}建议。此外,根据那里及以上的评论,分支预测似乎对这些循环非常有效。