Rog*_*ach 81 java performance if-statement premature-optimization shorthand
if
java中有两种类型的语句 - 经典:if {} else {}
和速记:exp ? value1 : value2
.一个比另一个快还是一样?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
Run Code Online (Sandbox Code Playgroud)
三元运算符:
int x = (expression) ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 105
那里只有一种"if"语句.另一个是条件表达式.至于哪个会表现得更好:它们可以编译成相同的字节码,我希望它们的行为相同 - 或者说非常接近,你绝对不希望在性能方面选择其中一个.
有时if
语句更具可读性,有时条件运算符更具可读性.特别是,当两个操作数是简单且无副作用时,我建议使用条件运算符,而如果两个分支的主要目的是它们的副作用,我可能会使用一个if
语句.
这是一个示例程序和字节码:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
Run Code Online (Sandbox Code Playgroud)
Bytecode反编译javap -c Test
:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,字节码在这里有一点点差别 - 无论是否istore_1
发生在brance中(不像我之前的巨大缺陷尝试:)但如果JITter最终得到不同的本机代码,我会非常惊讶.
Vic*_*let 10
您的两个示例都可能编译为相同或几乎相同的字节码,因此性能应该没有区别.
如果执行速度有所不同,你仍然应该使用最惯用的版本(这将是第二个用于根据简单条件和两个简单子表达式分配单个变量,第一个用于执行更复杂的操作或不适合单行的操作).