使用“else”会加快代码的执行速度吗?

时间:2013-08-14 09:20:47

标签: java if-statement

如果我的某些方法中有一些代码最多包含9个if语句,并且所有这些语句中的大部分内容只会满足if个要求之一,则使用else if加快我的代码?

例如,如果我有这个

if (x == 1){
    do something;
}
if (x == 2){
    do something;
}
if (x == 3){
    do something;
}
if (x == 4){
    do something;
}

是否会将其更改为加速代码?

if (x == 1){
    do something;
}
else if (x == 2){
    do something;
}
else if (x == 3){
    do something;
}
else if (x == 4){
    do something;
}

在我的实际代码中,if语句正在评估比整数更复杂的东西。

8 个答案:

答案 0 :(得分:6)

可能。这取决于编译器是否可以检测到您的条件是互斥的,并根据它进行优化。在简单整数的情况下,它可能可以;在更复杂的情况下,它不能。

但它不只是关于编译器。它也是关于读者的。使用else if文件给读者说案例是相互排斥的,这是一件好事。

另一种选择是从每个if块末尾的函数返回。

答案 1 :(得分:3)

它可能会加快您的代码......或者它可能对性能没有任何影响。这取决于实际测试的复杂性,以及JIT编译器是否可以将两个版本优化为等效的本机代码。

但更重要的是,添加else会使代码的意图更清晰......假设这些是非常不相交的选择。

因此,我建议添加else而不考虑性能

答案 2 :(得分:2)

如果最后一个正在执行则为否,如果发现任何中间条件为真,则为是。

但一般情况下,使用if-else语句会更有意义如果条件相互排斥。其他选项是使用开关语句

毕竟(java)解释器以这种方式工作。逐行扫描中间字节码...转换为机器代码并执行它(假设我们不在这里考虑JIT编译器)。所以使用if-else比使用多个if语句更有益。

答案 3 :(得分:2)

肯定其他部分是更好的表现,因为,如果情况即使比较完成,它将继续检查,但是部分是互斥的,因此不进一步比较。如果您运行下面的代码,您可以清楚地了解。时间是微秒。

public class Test {

public static void main(String[] args) {

    ifCase(5);
    ifElseCase(5);
}

private static void ifCase(int x) {

    long start = System.nanoTime();
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }

    long end = System.nanoTime();

    System.out.println("time " + (end - start) / 1000);

}

private static void ifElseCase(int x) {
    long start = System.nanoTime();
    if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    }
    long end = System.nanoTime();

    System.out.println("time " + (end - start) / 1000);
}

}

答案 4 :(得分:1)

如果您要比较数字,使用switch会更有效率,但是,使用else已经加快了速度。

考虑一下:在你的第一个例子中,每个比较都已完成,即使已经被击中了。在你的第二个例子中,机器只进行比较直到一个为真,剩下的比较不再执行。

当进行更昂贵的比较时,效果可能会非常显着。我曾经(〜2003)通过添加缺失的else来“优化”工业机器人中的解析器。它可以将配置文件的解析速度从10秒以上加速到不到一秒(甚至“解决方案”效率非常低,但这是另一个故事)。

答案 5 :(得分:0)

else仅在if没有时执行,所以肯定会加快速度。但else表示如果if没有发生,请执行此操作。

答案 6 :(得分:0)

是。在else-case中,当发现一个条件为真时,将不评估另一个条件。如果按照喜好顺序放置它们,它可能会给你带来很大的影响。

没有别的,每次都会评估条件。

答案 7 :(得分:0)

这真的取决于,在第一种情况下,你拥有所有的if,所有这些都将通过jvm

如果在第二种情况下,如果条件满足第一种情况,那么你很幸运并且运行速度会比较快。如果它与“else if”

中的最后一个“if”匹配,则可能需要比正常情况更长的时间