2021-05-03 字节码层面分析 ++i 、i++、i+=1的效率问题(可以提前看一下什么叫操作数栈,局部变量表,以及一些字节码操作指令)

刷着题,突然想到是i++效率高,还是i+=1效率高呢,++i、i++到底在字节码层面到底是如何工作的呢?

  • 先看一段程序:
public class text {
    public static void main(String[] args){
        int a = 1;
        a=(a++);
        System.out.println(a);

        int b =1;
        b=(++b);
        System.out.println(b);

        int c = 1;
        for(int i=0 ; i<10 ; i++){
            c=(c++);
        }
        System.out.println(c);

        int d = 1;
        for(int i=0 ; i<10 ; i++){
            d=(++d);
        }
        System.out.println(d);

        int e =1;
        e+=1;
        e++;
        System.out.println(e);
    }
}
  • 对应结果如下:在这里插入图片描述

  • 第一个问题:i++,++i的字节码区别?我们分别看其对应的字节码:在这里插入图片描述
    对应int a = 1; a=(a++);

  • 在这里插入图片描述
    对应int b= 1; b=(++b);区别在于a++是先ILOAD,再IINC,而++b,是先IINC,再ILOAD,这就是输出结果不同的原因:
    a++ :是把局部变量表中的值存入到了操作数栈顶的位置,然后IINC直接在局部变量表槽1(局部变量表的存放数据的单位)的位置增加1,这时候a++就结束了!但是当我们进行赋值的时候,它的操作是把操作数栈顶的值返回到槽1中,这时候就把a原本加1的值给覆盖掉了。
    b++:是先INNC,直接在局部变量表槽2的位置增加1,然后再执行ILOAD,把值放入到操作数栈顶,然后赋值的时候,同样是把操作数栈顶的值返回到局部变量表槽2中,这时候就没有把b+1的值覆盖掉。

  • 第二个问题: 为什么这两段a++,++b在循环后,值却不同呢?(和问题1一样)

  • 第三个问题:i++,i+=1到底哪一个效率更高呢?
    我们通过字节码进行分析:在这里插入图片描述
    通过字节码可以得到:其实都是通过一条字节码指令完成,所以效率差不多(或许在字节码层面分析还是不够严谨(可以看一下相应的本地码,但这就涉及到了使用的虚拟机类型,操作系统,硬件的问题,由大佬解决吧还是))

  • 以上仅仅是个人看法,有错误欢迎指出,希望研三能去大厂!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值