java语言 a i_在读java源码的过程中,遇到注释里说用a[i] = b; i++; 而不是用a[i++] = b;...

引用来自“iBoxDB”的评论

a[i++] 中的 i++(inc)指令在 在 =(mov)指令前执行,要先分配一个临时空间才能执行.

a[i++]=b 的指令

mov temp i

inc i

mov a[temp] b

a[i]=b; i++的指令

mov a[i]=b

inc i

这个观点有问题的。首先,现在的优化编译器,这类的情况会自动优化到位。简单说两种写法,优化出来的指令差异不大。

其次, 即便这里的i已经是在寄存器里,对多级流水线的指令集,也不需要 临时空间备份。

inc i  执行后,执行到 mov a[i] b ,此时i累加后的结果并没有写回到寄存器,实际执行的效果就等同与, 先 mov a[i] b 再执行 inc i一样。

此处再说个小例子,假设, inc i 需要2个系统时钟才能处理完毕 mov a[i] b 需要3个系统时钟才能处理完毕,那么

inc i

mov a[i] ,b

这实际需要4个系统时钟。

而反过来写,

mov a[i],b

inc i

只需要三个系统时钟。

哈,最后说一点,上述这些内容都是工程经验,但更多是基于c语言的在特定指令集之上的汇编优化才需要考虑。而如arm之类,很少有人手工汇编能比优化编译的性能要好。至于java,有自己该忙的事情,上述这些性能问题,不要去谈。没有意义。我不去怀疑,java是否会临时分配temp, 但分配不分配都没有所谓性能的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值