曾经写代码测试,估计也有不少人做过这种傻事,最终“测不准”,从内部着手分析吧。
1.对于int i=0;,表达式
1)i++
2)++i
3)i+=1
本身没什么区别,最终都编译成"iinc 1,1"
使用i变量时:
---------------
i++;
---------------
iload
iinc 1, 1
---------------
++i
---------------
iload
iinc 1, 1
但使用中i++可能比++i有优势,vm可能会优化调i++后面无效的iinc操作。
2.再看 i+=n 与 i=i+n 的区别
i+=n
------------
iinc
i=i+n 比较低效
------------
iload
iconst/bipush
iadd
istore
vm里预存012345整数,应此i>5时i=i+n中的iconst将被bipush指令代替。
对于浮点数,只预存012。
3.对于乘除运算,则*=与= *没区别, 位运算也一样:
i*=n
i=i*n
-------------
iload
iconst/bipush
imul/idiv
istore
小结,考虑性能尽量使用+=、-=,其它则无需理会。另外,别指望通过声明byte、short代替int来提高性能(不是c哦),反而增加类型转换的消耗,vm运算中都当作int处理。其实在大部分情况下,不必计较这么多,怎么顺手怎么写。
ps:
[CMD]javap -c class