2013-12-12 49 views
3

我有两个简单的代码片段以下.nippet 1没有其他condition.Logically这两个片段服务于相同的目的。if-else优化和陷阱?

我想知道是否有任何疑难解答或任何优化改进,如果我要在我的程序中的两个片段之间进行选择?

片段1

public boolean isOauthTokenValid(long oauthExpiryTimestamp){ 

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

    return false; 
} 

片段2

public boolean isOauthTokenValid(long oauthExpiryTimestamp){ 

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

请问这给在字节码级优化?

+0

它会给字节码级别的任何性能改进?或者只是增加可读性 – cherit

+1

'如果(...)返回true否则返回false;'没有任何意义。只要'返回...;'。 –

+0

请注意不成熟的优化 - – KevinDTimm

回答

16

完全免除if。您可以直接使用比较的结果:

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

谢谢!当谈到编程风格时,不使用这个习惯用语是我最大的宠儿之一。 – ApproachingDarknessFish

3

更简单:

return oauthExpiryTimestamp >= System.currentTimeMillis(); 

通过这种方式,你可以不用使用条件在你的代码。但无论如何,性能增益可以忽略不计。

为什么这有效?因为如果条件中的布尔表达式为true,那么您将返回true,如果它是false,则返回false - 因此它足以返回布尔表达式的值。

+0

这将导致与使用if-else相同的字节码? – cherit

+1

@TitoCheriachan“也许”。它依赖于静态编译器,无论如何,JIT编译器可能会在运行时将其优化为相同的代码。这里重要的是这两个版本在语义上是等价的,并且使用任何一个版本获得的性能差异可以忽略不计。编写易于阅读的代码更重要,而不必担心如此微小的微型优化 –

0

一个好的编译器会产生相同的字节码。

在这种情况下,您应该以可读性为导向(请参阅关于全部删除条件的其他解答)。

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 

然而,所有版本究竟表现在热点JVM相同的性能。