1. 程式人生 > >關於i++,++i與i+=1的效能

關於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