1

如果我的某些方法中有一些包含多达 9if条语句的代码,并且所有这些语句本质上只能满足其中一个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语句正在评估比整数更复杂的东西。

4

8 回答 8

6

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

但这不仅仅是关于编译器。这也与读者有关。使用else if文件让读者知道这些案例是互斥的,这是一件好事。

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

于 2013-08-14T09:22:41.303 回答
3

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

但更重要的是,添加else's 将使您的代码的意图更清晰......假设这些确实是不相交的替代方案。

因此,出于这个原因,我建议添加else'而不管性能如何

于 2013-08-14T09:23:58.783 回答
2

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

但一般来说,如果条件是互斥的,则使用 if-else 语句更有意义。其他选项是使用switch 语句

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

于 2013-08-14T09:26:39.520 回答
2

肯定 else 部分性能更好,因为,对于 If 情况,即使比较完成,它也会继续检查,但 else 部分是互斥的,因此不会进一步比较。下面的代码,如果你运行你可以清楚地理解。时间以微秒为单位。

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

}

于 2013-08-14T09:39:21.443 回答
1

如果您正在比较数字,使用 aswitch会更有效,但是是的,使用else已经加快了速度。

想想看:在你的第一个例子中,每个比较都完成了,即使一个已经被击中。在您的第二个示例中,机器仅进行比较,直到其中一个为真,其余的比较不再执行。

当进行更昂贵的比较时,效果可能会非常显着。我曾经(~2003 年)通过添加缺失else的 s 来“优化”工业机器人中的解析器。它将配置文件的解析速度从超过 10 秒缩短到不到 1 秒(即使那个“解决方案”效率非常低,但那是另一回事了)。

于 2013-08-14T09:28:16.460 回答
0

elseif仅在不执行时才执行,因此它肯定会加快速度。但else意味着这样做以防万一if

于 2013-08-14T09:23:11.653 回答
0

是的。在其他情况下,当发现一个条件为真时,将不评估另一个条件。如果您将它们按相似度排列,它可能会给您带来重大影响。

否则,每次都会评估所有条件。

于 2013-08-14T09:24:33.303 回答
0

这真的取决于,在你拥有所有 if 的第一种情况下,所有 if 都将由 jvm 完成

在第二种情况下,如果条件满足第一种情况,则您很幸运,并且运行速度相对会非常快。否则,如果它与“else if”中的最后一个“if”匹配,则这可能比正常的 if 花费更长的时间

于 2013-08-14T09:31:11.657 回答