我在下面有两个简单的代码片段。服务器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;
}
}
这会在字节码级别进行优化吗?
答案 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)
一个好的编译器会产生等效的字节码。
在这种情况下,您应该遵循可读性(请参阅有关完全删除条件的其他答案)。