编码
Set<String> set = new HashSet<String>();
int n = set.size();
Object o = new Object();
if (!(n != 1 && set.contains(o))) {
System.out.println("Foo");
// Do stuff...
}
生成字节码
0 new java.util.HashSet [16]
3 dup
4 invokespecial java.util.HashSet() [18]
7 astore_1 [set]
8 aload_1 [set]
9 invokeinterface java.util.Set.size() : int [19] [nargs: 1]
14 istore_2 [n]
15 new java.lang.Object [3]
18 dup
19 invokespecial java.lang.Object() [8]
22 astore_3 [o]
23 iload_2 [n]
24 iconst_1
25 if_icmpeq 38
28 aload_1 [set]
29 aload_3 [o]
30 invokeinterface java.util.Set.contains(java.lang.Object) : boolean [25] [nargs: 2]
35 ifne 46
38 getstatic java.lang.System.out : java.io.PrintStream [29]
41 ldc <String "Foo"> [35]
43 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
46 return
编码
Set<String> set = new HashSet<String>();
int n = set.size();
Object o = new Object();
if (n == 1 || !set.contains(o)) {
System.out.println("Foo");
// Do stuff...
}
生成字节码
0 new java.util.HashSet [16]
3 dup
4 invokespecial java.util.HashSet() [18]
7 astore_1 [set]
8 aload_1 [set]
9 invokeinterface java.util.Set.size() : int [19] [nargs: 1]
14 istore_2 [n]
15 new java.lang.Object [3]
18 dup
19 invokespecial java.lang.Object() [8]
22 astore_3 [o]
23 iload_2 [n]
24 iconst_1
25 if_icmpeq 38
28 aload_1 [set]
29 aload_3 [o]
30 invokeinterface java.util.Set.contains(java.lang.Object) : boolean [25] [nargs: 2]
35 ifne 46
38 getstatic java.lang.System.out : java.io.PrintStream [29]
41 ldc <String "Foo"> [35]
43 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
46 return
这是完全相同的。因此,无论您测量多么精细,都不会有任何性能差异。编译后的代码是相同的。
(请注意,这样做的原因是javac
实际上将if
语句分解为单独的条件测试和分支,因此它实际上为每种可能性制定了路径。)