【问题标题】:Is chaining multiple `if else` faster than multiple consecutive `if` statements? [duplicate]链接多个“if else”是否比多个连续的“if”语句更快? [复制]
【发布时间】:2021-07-21 08:15:41
【问题描述】:

这个问题更多的是理论问题而不是实际问题,仅考虑多个if 与链式if else 的性能。让我们抛开switch、可读性、微优化、错误减少等问题。

假设我有以下构造:

if( i == 1 ){
  // Do one thing
}
else if( i == 2 ){
  // Do another thing
}
else if( i == 3 ){
  // Do a third thing
}
// ... and so on

我一直认为执行起来会比以下更有效:

if( i == 1 ){
  // Do one thing
}
if( i == 2 ){
  // Do another thing
}
if( i == 3 ){
  // Do a third thing
}
// ... and so on

但在现代编译器中真的如此吗?据我了解,现在的编译器在这些类型的结构上使用了很多优化和分支策略,所以也许它们实际上都会产生相同的可执行代码?

【问题讨论】:

    标签: if-statement compiler-optimization


    【解决方案1】:

    除了关于重复的评论之外,还要记住,这两个 sn-ps 具有完全不同的语义。想象一下

    int i = 1;
    if (i == 1) {
      i = 2;
    } else if (i == 2) {
      i = 3;
    }
    print(i); //will print 2
    

    int i = 1;
    if (i == 1) {
      i = 2;
    } 
    if (i == 2) {
      i = 3;
    }
    print(i); //will print 3
    

    我认为编译器优化不会(或应该)总是能够推断出 if .. if 是否应该优化为 if .. else if。在这个简单的示例中可以做到这一点,但是更改状态(以及因此条件的结果,无论代码风格多么糟糕!)可能要复杂得多,这将使编译器无法决定.所以不,即使在现代编译器中,这两个 sn-ps 通常也不会最终被编译成相同的结果......

    【讨论】:

      【解决方案2】:

      多个if else 更快,因为条件检查过程将在匹配条件上停止。例如,您想找到实际上等于 2 的变量的值。

      var x = 2;
      
      if (x==1) {
      } else if (x==2) { // -- stop here because the variable is equal to 2 
      } else if (x==3) { // -- unchecked
      } else if (x==4) { // -- unchecked
      }
      

      没有else,检查过程将继续进行。

      var x = 2;
      
      if (x==1) {
      } 
      if (x==2) { // -- match condition 
      } 
      if (x==3) { // -- keep checking
      } 
      if (x==4) { // -- keep checking
      }
      

      没有else 条件的条件语句通常在每个if 块将返回匹配条件中的某些内容时使用,这将停止其余语句的执行。例如,您在返回值的函数中使用它。

      function getValue(x) {
        if (x==1) {
          return 'one';
        } 
        if (x==2) {  
          return 'two';
        } 
        if (x==3) { // -- unreachable if x == 2
          return 'three';
        } 
        if (x==4) { // -- unreachable if x == 2
          return 'four';
        }
      }
      
      var x = 2;
      var value = getValue(x);
      

      【讨论】:

      • because the conditional checking process will stop on the match condition - OP 特别确认并询问编译器是否能够将一个转换为另一个。链接的副本表明,当编译器能够弄清楚时,else if 的速度快,这与您的说法相反。
      【解决方案3】:

      在这种情况下 if else 会更快,因为如果它进入第一个 if 它将“跳转”其余的 else 情况。使用 if 语句,这不会发生。

      if-else 执行示例 --> I==1
      比较第一个 if
      执行第一个 if
      结束

      使用 if --> I==1 的执行示例
      比较第一个 if
      执行第一个 if
      比较第二个 if
      比较第三个 if
      结束

      正如你所看到的,如果 else 是一个最佳解决方案,它只运行与 i 等于最后一种情况相同数量的比较

      对于编译器,它会是类似的,所以一定要在这种情况下使用 if else 而不是很多 if

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多