java基础 int变量自增 效率问题

来源:互联网 发布:支付宝超强助手源码 编辑:程序博客网 时间:2024/05/29 14:38

本文论述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)Vflags: ACC_PUBLICCode:  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)Vflags: ACC_PUBLICCode:  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)Vflags: ACC_PUBLICCode:  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;

0 0
原创粉丝点击