首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套Ifs VS 2独立IFs -性能方面?

嵌套Ifs VS 2独立IFs -性能方面?
EN

Stack Overflow用户
提问于 2013-01-21 15:40:47
回答 3查看 263关注 0票数 0

版本A :

代码语言:javascript
复制
if ((A)&&(B)) doSth;
if (B) doSthElse;

版本B :

代码语言:javascript
复制
if (B)
{
    if (A) doSth;
    doSthElse;
}

这两种方法中哪一种更好,性能更好?

备注:

  • 实际代码将以每秒数百万次的速度使用,因此性能和速度至关重要。在开始分析之前,请您给我一些输入,以防我遗漏了什么?
  • 该代码正在使用MacOSX10.6.8上的Clang++编译,使用-O3编译。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-21 16:22:25

假设A和B都是简单的布尔值,我们需要考虑条件分解为什么的可能性:

  1. 捷径评估:如果(A)很可能比(B)更假,写(A & B),否则(B & A)。
  2. 分支可预见性:使用更可预测的条件包围大块。例如,如果B是可预测的,那么第二种形式是首选。
  3. 例如,尝试将不可预测的条件赋值转换为(?:)。 X=c?A: b;//数据依赖 至 如果(c) x= a;//控制流依赖关系,则x= b;

如果c是不可预测的。在这种情况下,您希望用数据依赖项替换控件流依赖项,该依赖项可以编译为条件移动。如果控制依赖关系不可预测,则为净增益。

票数 2
EN

Stack Overflow用户

发布于 2013-01-21 15:41:42

这取决于什么是AB。如果B是一个复杂的函数,则第二个函数只计算它一次,而第一个函数只计算它两次(当然,如果A有效的话)。

对于琐碎的情况(即两个bool),这都不重要。

当然,你可以分析一下,我怀疑这会是个瓶颈。

票数 3
EN

Stack Overflow用户

发布于 2013-01-21 21:58:18

如果你的A和B值是布尔值,那么我建议第三个版本:

代码语言:javascript
复制
if (A & B) doSth;
if (B) doSthElse;

此版本按位使用,并在多个布尔值中创建单个比较。这也可以应用于在另一个答案中张贴的三元操作符解决方案。

这可能是有益的,因为它删除了每一个&&替换的分支。大多数情况下,和几个布尔人在一起比做一个分支的价值每一个要便宜。这适用于任何具有相对昂贵的分支的cpu体系结构,这是任何具有无序执行或长指令执行管道(它几乎占了一切)的任何东西。

重要注意:在x86上,条件执行器和分支预测器足够好,如果布尔A是很好的预测(例如,很少变化,预测率在99.6%以上),那么它的使用效率就更高&& form和快捷方式超过了条件的其余部分。然而,ARM和PowerPC体系结构几乎总是受益于较少的分支。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14442126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档