相信很多人寫了 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 接著使用 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 4: return public static void main(java.lang.String[]); Code: 0: iconst_5 1: istore_1 2: iload_1 3: invokestatic 6: iload_1 7: invokestatic 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