[英]Comparing java bytecode for a simple loop?
我試圖找出編譯時這兩個循環有多相似:
for (int i = 0; i < result.length; i++){
result[i] = array[((i < index) ? i : i + 1)];
}
和
for (int i = 0; i < result.length; i++){
if(i < index) result[i] = array[i];
else result[i] = array[i + 1];
}
我發現很難找出每個循環的操作在哪里。
我應該如何比較這兩個循環? 謝謝
這是我使用javap -c
運行程序時得到的:
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class Test
3: dup
4: invokespecial #3 // Method "<init>":()V
7: pop
8: return
public void Test();
Code:
0: bipush 10
2: newarray int
4: astore_1
5: iconst_0
6: istore_2
7: iload_2
8: bipush 10
10: if_icmpge 23
13: aload_1
14: iload_2
15: iload_2
16: iastore
17: iinc 2, 1
20: goto 7
23: aload_0
24: aload_1
25: iconst_5
26: invokespecial #4 // Method removeAndTrimConcise:([II)[I
29: pop
30: bipush 10
32: newarray int
34: astore_1
35: iconst_0
36: istore_2
37: iload_2
38: bipush 10
40: if_icmpge 53
43: aload_1
44: iload_2
45: iload_2
46: iastore
47: iinc 2, 1
50: goto 37
53: aload_0
54: aload_1
55: iconst_5
56: invokespecial #5 // Method removeAndTrim:([II)[I
59: pop
60: return
}
應該大致介於newarray
(我假設您在每個循環之前創建一個新數組)和goto
(如您所見,將控制流返回到上一行,從而進行循環)之間:
第一循環:
2: newarray int
4: astore_1
5: iconst_0
6: istore_2
7: iload_2
8: bipush 10
10: if_icmpge 23
13: aload_1
14: iload_2
15: iload_2
16: iastore
17: iinc 2, 1
20: goto 7
第二:
32: newarray int
34: astore_1
35: iconst_0
36: istore_2
37: iload_2
38: bipush 10
40: if_icmpge 53
43: aload_1
44: iload_2
45: iload_2
46: iastore
47: iinc 2, 1
50: goto 37
它們似乎幾乎相同。
將它們放在兩個單獨的文件中,唯一的區別是循環。 重新運行javap並進行比較。
但是,除了滿足您的好奇心之外,真正的答案是“沒有關系”。 沒有性能優化。 您應該編寫更清晰,更易讀的內容。 部分原因在於口味。 我的首選是三元運算符。
我建議一次循環編譯一次程序,另一次循環編譯一次。 或者,制作2種方法,並用要使用的循環類型標記它們,然后編譯它們。 通過Text Diff http://www.textdiff.com/中的復制粘貼來輕松查看兩者之間的區別。
這將消除重復循環的編譯器優化的所有問題(我對這個主題不甚了解,這可能會發生,但我認為可能會發生)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.