哪个效率更高?x=x+1, x+=1, x++
为什么会写这篇文章
看到这篇文章 鱼C缸-哪个效率更高?x=x+1, x+=1, x++不禁停下来思考了一下,博主这篇文章的分析是不是太草率了?博主从高级语言角度去分析,而脱离具体的底层似乎不可取。既然如此,我们结合底层汇编代码来实践一下。
上结论:对于C/C++语言,截至到目前,主流编译器编译出来的代码效率是一样的;对于Java语言,使用JDK编译出来的Java字节码似乎x++效率最高,但是Java字节码不直接对应底层硬件的机器码,而是由Java虚拟机在运行时解释或编译成特定硬件架构的机器码。因此,无法直接将Java字节码直接对应机器码,需要考虑特定的JVM实现。所以Java语言需要自行实践一下。
推荐的反汇编工具和博客
C语言-mips64 gcc 13.2.0
不论是x = x + 1、x+=1还是x++生成的汇编代码是一样的,所以机器在执行时效率也是一样的。这里选用的架构和编译器是mips64和gcc;感兴趣的小伙伴也可以试一试其他的架构和编译器,这里我自己用x86的架构得到的汇编代码也是一样的。得到的汇编结果见下图:
x = x + 1
x += 1
x++
Java语言-jdk 21.0.0
注意jdk并不是将Java语言转换成汇编语言,而是Java字节码。Java字节码是Java源代码经过编译后生成的中间代码,它是一种面向Java虚拟机(JVM)的指令集。Java字节码不直接对应底层硬件的机器码,而是由Java虚拟机在运行时解释或编译成特定硬件架构的机器码。因此,无法直接将Java字节码转换为特定硬件的机器码,除非考虑特定的JVM实现。
这里只给大家展示了Java语言“x=x+1, x+=1, x++”的Java字节码,未真正运行实践,感兴趣的读者可以自行上机实践。
x = x + 1
x += 1
x++
可以看到jdk生成的字节码,x+=1和x++最简洁,仅有一条字节码;而x=x+1生成了三条java字节码。似乎iinc指令不用取指令和存指令。不过最终代码的运行效率怎样还得真正上机实践,从Java字节码来看似乎x+=1和x++效率最高。
最后
对于C/C++语言,截至到目前,同一个主流编译器编译出来的汇编代码是一样的,所以x=x+1, x+=1, x++代码效率是一样的;
对于Java语言,虽然jdk对代码x=x+1, x+=1, x++编译出来的java字节码存在差异,但是是否真正运行时有差异还得上机实验一下。
最近还得赶论文,先写在这里叭,感兴趣的小伙伴可以上机实践验证一下,后面有时间再来更新补充。
感谢孙师姐推荐的反汇编工具和博客,师姐真的很漂亮。