我只是想知道,编译器使用什么高效?
if (condition) {
return something;
} else {
dosomething();
}
OR
if (condition) {
return something;
}
dosomething();
我知道这些差异非常小,而且应该选择更易读的版本,但是我们只能说我们会执行这个代码十亿次,哪一个更有效?
我也知道“现实世界”中根本没有任何收获,但我只是好奇。
答案 0 :(得分:6)
没有性能差异。 bytecode包含相同的指令,以相同的顺序运行相同的数据。
L0
LINENUMBER 11 L0
ICONST_1
ISTORE 0
L1
LINENUMBER 12 L1
ILOAD 0
IFEQ L2
L3
LINENUMBER 13 L3
GETSTATIC p/A.something : Ljava/lang/Object;
ARETURN
L2
LINENUMBER 15 L2
FRAME APPEND [I]
INVOKESTATIC p/A.dosomething()V
L4
LINENUMBER 17 L4
ACONST_NULL
ARETURN
L5
LOCALVARIABLE condition Z L1 L5 0
MAXSTACK = 1
MAXLOCALS = 1
VS
L0
LINENUMBER 7 L0
ICONST_1
ISTORE 0
L1
LINENUMBER 8 L1
ILOAD 0
IFEQ L2
L3
LINENUMBER 9 L3
GETSTATIC p/B.something : Ljava/lang/Object;
ARETURN
L2
LINENUMBER 11 L2
FRAME APPEND [I]
INVOKESTATIC p/B.dosomething()V
L4
LINENUMBER 12 L4
ACONST_NULL
ARETURN
L5
LOCALVARIABLE condition Z L1 L5 0
MAXSTACK = 1
MAXLOCALS = 1
public class A {
static Object something = new Object();
public static void main(String[] args) {
test();
}
private static Object test() {
boolean condition = true;
if (condition) {
return something;
} else {
dosomething();
}
return null;
}
private static void dosomething() {}
}
VS
public class B {
static Object something = new Object();
public static void main(String[] args) {
test();
}
private static Object test() {
boolean condition = true;
if (condition) {
return something;
}
dosomething();
return null;
}
private static void dosomething() {}
}
答案 1 :(得分:2)
两个版本没有任何区别。只有可能的差异纯粹来自可读性的观点。
如果采用在函数开头进行检查并且尽快执行返回的样式,则第二个就在手中。
void foo()
{
if (condition1)
return;
if (goo())
return;
//...
}
否则,第一个版本提供更明显的分支。
答案 2 :(得分:1)
它根本不会产生重大影响。意识到else
没有评估另一个表达式,只是说原始条件是否为假,请执行此操作。 Condition
仍然会双向评估。
事实上,根据不同编译器所做的优化,它可能会产生相同的字节码。 IDE有很多插件可以查看Java字节码。
答案 3 :(得分:1)
任何收益都可以忽略不计,如果结果指令相同,我也不会感到惊讶。
你几乎总是更善于专注于“低悬的水果”,而不是如此小的性能微观优化。
Err在可读性方面。并始终采取措施确保您确实存在性能瓶颈。
答案 4 :(得分:1)
我怀疑性能有很大差异,但我倾向于选择后者,因为前者会导致缩进地狱。
即使执行该代码十亿次,doSomething()
几乎肯定会在时间上淹没if/else
。
我总是首先针对可读性进行优化,并且只有在出现问题时才会担心性能。
不可读的代码远比代码稍慢的代码更具问题: - )
答案 5 :(得分:0)
我认为这只是个人偏好。
可以在此question
找到更多信息性答案