如果我的某些方法中有一些代码最多包含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
语句正在评估比整数更复杂的东西。
答案 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”匹配,则可能需要比正常情况更长的时间