【问题标题】:Conditional Branching Efficiency条件分支效率
【发布时间】:2015-06-04 23:07:21
【问题描述】:

我们参与了关于如何使代码更高效以及关于if-else 上的分支主题的讨论,这个话题出现了。

考虑以下代码:

if (a==1) {
    //... tasks
} else if (a==2) {
   //... tasks
}
...
} else if (a==9) {
    //... tasks
}

讨论证明,由于必须对代码的下半部分进行比较次数,上层代码的效率低于下层代码。

考虑这个替代方案:

if (a<=4) {
    if (a==1) {
        //... tasks
    } else if (a==2) {
        //... tasks
    }
    ...
} else {
    if (a==5) {
        //... tasks
    } else if (a==6) {
        //... tasks
    }
    ...
}        

在上述情况下,检查a=5,6,7, or 8 需要较少的比较次数,并且显然更有效。但我从来没有遇到过他们使用这种逻辑的代码。大多数代码通常使用switch 语句或前面sn-p 中提到的普通if 条件。后一种代码真的更高效还是花费相同的时间?

编辑:以上只是一个例子。总体思路是从条件池中区分不相交的条件集,然后根据不相交的原因应用额外的条件。

【问题讨论】:

  • 出于您提到的确切原因,Switch 语句通常以这种方式编译。因此,除非您有充分的理由,否则无需手动操作。
  • 根据语言(或编译器/JIT 实现),switch 语句很可能实际上是一个表查找,因此是一次比较。
  • @Slanec,如果假设被比较的值不是整数并且由于某种原因我们不能使用switch。那么将条件分解成不相交的集合(如果可能的话)然后应用额外的条件(如后者)是一种好习惯吗?
  • 如果a==1 几乎总是这样,第二个代码会更慢。这就是为什么编译器通常很难做出这些选择。最佳代码取决于数据。
  • @usr,没错,这个例子纯粹是为了写一个例子。我的意思是讨论在一组条件中有几个不相交的集合时的可能性。

标签: performance conditional-statements


【解决方案1】:

是的,第二个代码在一般情况下效率更高。

您通常看不到此类代码的三个原因:

  1. 改进相对较小。该数量取决于您的 CPU,但您只能节省一位数的 CPU 周期数。

  2. 对代码可读性的影响很严重。

  3. 需要优化的代码量通常少于已编写代码的百分之一。

你看,对于绝大多数代码来说,这根本不值得。


另外请注意,第二个代码也可能比第一个慢:如果a == 1 是绝大多数情况下,第二个代码不必要地添加第二个比较关键路径.永远不要在不了解关键路径的情况下进行优化。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2019-11-17
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多