java学习笔记-初探字节码和命令执行效率

来源:互联网 发布:在线c语言编程器 编辑:程序博客网 时间:2024/06/07 11:09
所谓的字节码,就是一段“虚拟机的机器指令”。Java虚拟机你可以把它当成一个模拟器运行的真实计算机,拥有自己的硬件结构和指令集,字节码给人的感觉就像是汇编语言代码一样的。


idea软件自带查看字节码的功能,我们可以随便打一段运算来看一下:


        int i=0;        i=i+1;        i+=1;        i+=2;        i++;

得到的字节码是


   L0    LINENUMBER 6 L0    ICONST_0    ISTORE 1   L1    LINENUMBER 7 L1    ILOAD 1    ICONST_1    IADD    ISTORE 1   L2    LINENUMBER 8 L2    IINC 1 1   L3    LINENUMBER 9 L3    IINC 1 2   L4    LINENUMBER 10 L4    IINC 1 1

需要说明的是,JVM是基于栈操作的,所以字节码指令大多是对操作数栈进行运算操作。详细字节码大家可以去网上搜,或者参考《深入理解JAVA虚拟机》这本书。


第一行:在栈顶存一个常量0,然后出栈将其存到变量表1的变量里(也就是i啦)


第二行:首先把变量表1的数据读到栈顶,再压一个常量1到栈顶,再将栈顶两个数弹出来进行加运算并将结果压回栈顶,再将栈顶弹出保存在变量表1中。


第三四五行:直接对变量表1中存放的数进行自增。


不难发现除了第一条加运算被翻译成了4条字节码之外,其他三条都只被简单翻译成一条字节码。(因为JVM的指令集支持直接对变量表进行操作,省去了使用操作数栈的麻烦)。


得出一个结论:i++;和i+=1;这两行代码的执行效率完全一样。个人不推荐为了执行效率在(复杂)运算式中使用++、--这样的运算符,因为这会极大的降低代码的可读性,导致他人工作上的麻烦(当然,如果你的目的就是为了增加别人读你代码的时间成本,而且自己在读自己代码的时候不存在任何障碍,那么你可以这么做)。


P.S.:除了idea自带的Show ByteCode工具之外,你也可以添加JClassLib这个插件,它的功能更强,可以显示常量池等一些其他内容,但我觉得字体有点小很难看清(或许是我没找对方法)