java基礎 int變量自增 效率問題

本文論述java中以下三條語句的效率問題。
1. i++;
2. i = i+1;
3. i += 1;

所採用的的方法是只寫出包含這三條語句的方法,編譯成字節碼,然後分析字節碼指令。
下面是我的java源碼:

public class Some {
    public void add1(int a){
        a++;
    }
    public void add2(int a){
        a = a + 1;
    }
    public void add3(int a){
        a += 1;
    }
}

使用javac指令編譯過後(javac Some.java),會生成Some.class文件。
然後使用指令 javap -verbose Some,顯示編譯後的字節碼指令。
如下:

public void add1(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=0, locals=2, args_size=2
     0: iinc          1, 1
     3: return
  LineNumberTable:
    line 3: 0
    line 4: 3

  public void add2(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=2, locals=2, args_size=2
     0: iload_1
     1: iconst_1
     2: iadd
     3: istore_1
     4: return
  LineNumberTable:
    line 6: 0
    line 7: 4

  public void add3(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=0, locals=2, args_size=2
     0: iinc          1, 1
     3: return
  LineNumberTable:
    line 9: 0
    line 10: 3

可以看到,add2方法中的i = i+1;通過編譯形成了4條字節碼指令:
0: iload_1
1: iconst_1
2: iadd
3: istore_1
並且操作數棧深度爲2,stack=2, locals=2, args_size=2

add1方法中的i++; add3中的i += 1;通過編譯形成了1條字節碼指令:
0: iinc 1, 1
並且操作數棧爲0, stack=0, locals=2, args_size=2

總結:
i++;和i += 1;形成的指令數較少,且不需要操作數棧。相對而言,i = i+1;需要至少2個操作數棧深度,並且形成的指令數較多。故,i++;和i+= 1;的效率一樣,並且二者的效率都優於i = i+1;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章