關於i++,++i與i+=1的效能
阿新 • • 發佈:2019-01-25
曾經寫程式碼測試,估計也有不少人做過這種傻事,最終“測不準”,從內部著手分析吧。
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