コード
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