背景
我編譯了以下方法:
public static final boolean equalTo(final int x, final int y) {
return x == y;
}
并且javap可以看到為它生成了以下位元組碼:
public static final boolean equalTo(int, int);
descriptor: (II)Z
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Code:
stack=2, locals=2, args_size=2
0: iload_0
1: iload_1
2: if_icmpne 9
5: iconst_1
6: goto 10
9: iconst_0
10: ireturn
LineNumberTable:
line 72: 0
StackMapTable: number_of_entries = 2
frame_type = 9 /* same */
frame_type = 64 /* same_locals_1_stack_item */
stack = [ int ]
我寫了ASM會產生相同的位元組碼,也創造了另一個版本,通過改變行為同樣goto 10到ireturn。它可以忽略不計,但這也減少了 的大小,StackMapTable因為它消除了跳躍。
題
我知道“它只是位元組碼”,并不表示機器會做什么,但是為什么編譯器goto 10可以簡單地發出時發出ireturn?
uj5u.com熱心網友回復:
前端編譯器使用簡單的模式生成代碼,它們依靠優化傳遞來清理。在x == y生成運算式時,編譯器并不“知道”接下來的事情是 return 陳述句。它可能會檢查這一點,但可以使用某種窺孔優化器輕松處理該額外步驟。
窺孔優化器的好處是它可以進行級聯優化,即一次優化的結果可以反饋到下一次。生成x == y運算式的代碼實際上沒有任何方法可以在不增加更多復雜性的情況下執行多于一個優化步驟的任何事情。
Java 編譯器曾經有一個優化功能,但后來被 HotSpot 拋棄了,它可以執行更強大的優化。在 java 編譯器中執行優化會減慢它的速度,并不會真正改善很多事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345308.html
標籤:爪哇 虚拟机 字节码 java-字节码-asm jvm-字节码
