if-else optimization&陷阱?

时间:2013-12-12 20:36:58

标签: java optimization if-statement

我在下面有两个简单的代码片段。服务器1没有其他条件。逻辑上两个片段都有相同的用途。

如果我要在我的程序中选择两个片段,我想知道是否有任何问题或任何优化改进?

Snippet 1

public boolean isOauthTokenValid(long oauthExpiryTimestamp){

    if (oauthExpiryTimestamp >= System.currentTimeMillis()){
        return true;
    }

    return false;
}

Snippet 2

public boolean isOauthTokenValid(long oauthExpiryTimestamp){

    if (oauthExpiryTimestamp >= System.currentTimeMillis()){
        return true;
    }
    else {
        return false;
    }
}

这会在字节码级别进行优化吗?

4 个答案:

答案 0 :(得分:16)

完全取消if。您可以直接使用比较结果:

return (oauthExpiryTimestamp >= System.currentTimeMillis());

答案 1 :(得分:3)

更简单:

return oauthExpiryTimestamp >= System.currentTimeMillis();

通过这种方式,您可以避免在代码中使用条件。但无论如何,性能提升可以忽略不计。

为什么会这样?因为如果条件中的布尔表达式是true,那么您将返回true,如果它是false,那么您将返回false - 所以它足以返回值{{1}}布尔表达式。

答案 2 :(得分:2)

回答问题本身,两个给定的片段被编译为相同的字节码,但与@rgettman和ÓscarLópez建议的简洁版本不同。

private final Random r = ThreadLocalRandom.current();

private boolean test() {
    return r.nextBoolean();
}

boolean full() {
    if (test()) {
        return true;
    } else {
        return false;
    }
}

boolean part() {
    if (test()) {
        return true;
    }
    return false;
}

boolean id() {
    return test();
}

结果:

        boolean full();
        Code:
        0: aload_0
        1: invokespecial #2                  // Method test:()Z
        4: ifeq          9
        7: iconst_1
        8: ireturn
        9: iconst_0
        10: ireturn

        boolean part();
        Code:
        0: aload_0
        1: invokespecial #2                  // Method test:()Z
        4: ifeq          9
        7: iconst_1
        8: ireturn
        9: iconst_0
        10: ireturn

        boolean id();
        Code:
        0: aload_0
        1: invokespecial #2                  // Method test:()Z
        4: ireturn

但是,所有版本在Hotspot JVM上都表现出完全相同的性能。

答案 3 :(得分:0)

一个好的编译器会产生等效的字节码。

在这种情况下,您应该遵循可读性(请参阅有关完全删除条件的其他答案)。