[JVM]位元組碼_i++與++i的區別和效率問題
阿新 • • 發佈:2018-12-13
通過jvm編譯指令,來解析為何i++與++i運算過程的區別
i++
public void testFun(){
int y = 13;
int x = y++;
}
對應指令結構
public void testFun(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: bipush 13 2: istore_1 3: iload_1 4: iinc 1, 1 7: istore_2 8: return LineNumberTable: line 7: 0 line 8: 3 line 9: 8
++i
public void testFun(){
int y = 13;
int x = ++y;
}
public void testFun(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: bipush 13 2: istore_1 3: iinc 1, 1 6: iload_1 7: istore_2 8: return LineNumberTable: line 7: 0 line 8: 3 line 9: 8
分析
i++ 3: iload_1 //從區域性變量表的slot_1位置載入變數到棧幀中 4: iinc 1, 1 // 對slot_1位置的變數進行+1操作 7: istore_2 // 將棧頂的值儲存到slot_2,即對應程式碼應該是變數x ++i 3: iinc 1, 1 // 對slot_1的變數y進行+1操作 6: iload_1 // 從slot_1載入變數y到棧幀,此時載入的Y的值已經被+1了 7: istore_2 // 將幀棧的值,儲存到區域性變量表slot_2即變數x
通過上面的操作即可明顯的看到i++與++i在指令的運算順序的區別
Note:
iinc 指令函式,對指定的int型別的變數進行+1或+2操作,如i++,i–或i+=2
根據描述可知該指令是需要指定引數的,1.指定變數,2.指定步幀 因此它的結構應該是 iinc slot_ , number ,即,對指定slot_n的變數進行+=number的操作
那麼i++和++i誰效率更高呢?答案是倆者效率一樣高