1. 程式人生 > >[JVM]位元組碼_i++與++i的區別和效率問題

[JVM]位元組碼_i++與++i的區別和效率問題

通過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誰效率更高呢?答案是倆者效率一樣高