版本A :
if ((A)&&(B)) doSth;
if (B) doSthElse;版本B :
if (B)
{
if (A) doSth;
doSthElse;
}这两种方法中哪一种更好,性能更好?
备注:
-O3编译。发布于 2013-01-21 16:22:25
假设A和B都是简单的布尔值,我们需要考虑条件分解为什么的可能性:
如果c是不可预测的。在这种情况下,您希望用数据依赖项替换控件流依赖项,该依赖项可以编译为条件移动。如果控制依赖关系不可预测,则为净增益。
发布于 2013-01-21 15:41:42
这取决于什么是A和B。如果B是一个复杂的函数,则第二个函数只计算它一次,而第一个函数只计算它两次(当然,如果A有效的话)。
对于琐碎的情况(即两个bool),这都不重要。
当然,你可以分析一下,我怀疑这会是个瓶颈。
发布于 2013-01-21 21:58:18
如果你的A和B值是布尔值,那么我建议第三个版本:
if (A & B) doSth;
if (B) doSthElse;此版本按位使用,并在多个布尔值中创建单个比较。这也可以应用于在另一个答案中张贴的三元操作符解决方案。
这可能是有益的,因为它删除了每一个&&替换的分支。大多数情况下,和几个布尔人在一起比做一个分支的价值每一个要便宜。这适用于任何具有相对昂贵的分支的cpu体系结构,这是任何具有无序执行或长指令执行管道(它几乎占了一切)的任何东西。
重要注意:在x86上,条件执行器和分支预测器足够好,如果布尔A是很好的预测(例如,很少变化,预测率在99.6%以上),那么它的使用效率就更高&& form和快捷方式超过了条件的其余部分。然而,ARM和PowerPC体系结构几乎总是受益于较少的分支。
https://stackoverflow.com/questions/14442126
复制相似问题