关于i++,++i与i+=1的性能

曾经写代码测试,估计也有不少人做过这种傻事,最终“测不准”,从内部着手分析吧。

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值