链接多个 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);
这个问题更多的是理论问题而不是实际问题,只考虑多个 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);