链接多个 if else 是否比多个连续的 if 语句更快?

Is chaining multiple `if else` faster than multiple consecutive `if` statements?

这个问题更多的是理论问题而不是实际问题,只考虑多个 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 else 会更快,因为如果它进入第一个 if 它将“跳过”其余的 else 情况。使用 if 语句,这不会发生。

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

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

如您所见,if else 是一个最佳解决方案,只有 运行 与 i 等于最后一个案例时相同的比较次数

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

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

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。在这个简单的示例中可以做到这一点,但是更改状态(以及因此条件的结果,无论代码风格多么糟糕!)可能要复杂得多,这将使编译器无法决定.所以不,即使在现代编译器中,这两个片段通常也不会最终编译成相同的结果...

倍数 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块将return匹配条件中的某些东西,从而停止其余语句的执行。例如,您在 return 是一个值的函数中使用它。

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);