工具准备
- idea
- jclasslib插件
准备
src/main/java/com/xiaofengs/Main.java
public class Main {
public static void main(String[] args) {
int i=0,j=0,k=0;
i++;
j=j+1;
k+=1;
}
}
接着使用javac将其编译,命令i如下
javac src/main/java/com/xiaofengs/Main.java -d target/classes
分析
找到 target/classes/com/xiaofengs/Main.class
使用jclasslib分析
根据JVM规范可以知道
iconst_n
是在操作数栈中声明值为n的变量
istore_n
则是将操作数栈的结果存储进局部变量表数组
iinc m by n
将局部变量表数组中索引为m的变量增加n
iload_n
将局部变量表数组地址为n的变量加载进入操作数栈
iadd
将操作数栈的值进行相加操作
在分别存储 i j k
之后
i++
是直接在局部变量表数组中存储i+1后的数值
j=j+1
则需要先在常量池中声明1后再进行加的操作然后存储到局部变量表数组中
k+=1
则和k++
操作类似
总结
由上方分析不难看出在编写程序中 i+=n
的操作原理上执行效率比 i = i+n
的 快