初探 Java 與 bytecode

相信很多人寫了 Java 很久但是沒有看過 Java Compiler compiled 的 bytecode
Java 官方提供指令 javap 來 disassemble 編譯好的 .class
這幫助我們在理解 Java compiler 與 Java Virtual Machine 的運作機制,是個方便的工具。

我們以常見的 i++, ++i 在 for 迴圈中是否有差別為例
如下方 Java 程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
public static void main(String args[]) {
int n = 5;
loop1(n);
loop2(n);
}

public static void loop1(int n) {
for (int i = 0; i < n; i++) {}
}

public static void loop2(int n) {
for (int i = 0; i < n; ++i) {}
}
}

使用 Java compiler compile Test.java

1
$ javac Test.java

接著使用 javap 指令 印出 bytecode 的指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ javap -c Test
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: iconst_5
1: istore_1
2: iload_1
3: invokestatic #2 // Method loop1:(I)V
6: iload_1
7: invokestatic #3 // Method loop2:(I)V
10: return

public static void loop1(int);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iload_0
4: if_icmpge 13
7: iinc 1, 1
10: goto 2
13: return

public static void loop2(int);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iload_0
4: if_icmpge 13
7: iinc 1, 1
10: goto 2
13: return
}

我們可以看到 loop1, loop2 的迴圈內的指令是相同的
想要了解 bytecode 指令所代表的意思請參照下方網址

Java Virtual Machine 相關指令查詢 https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
Reference: https://stackoverflow.com/questions/4831748/is-i-really-faster-than-i-in-for-loops-in-java

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×