Java 自動裝箱導致的性能問題

從 Java 1.5 開始,新增了自動裝箱(autoboxing)的功能,這一定程度上模糊了基本類型與裝箱基本類型的區別,有些人會很隨意地將兩者進行混用,這樣代碼在編譯及運行時雖不報錯,但在性能上卻有着不小的差別,看下面的例子:

long startTime = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < 100000000; i++) {
    sum += i;
}
System.out.println("計算結果: sum = " + sum);
System.out.println("共耗時 " + (System.currentTimeMillis() - startTime) + " 毫秒!");

上面的代碼累加了從 0 到 100000000 的和,將和存放在 Long 類型的變量 sum 中,並記錄代碼運行時間,以下是在我機器上的執行結果:

計算結果: sum = 4999999950000000
共耗時 470 毫秒!

現在將其中的 sum 改爲 long 類型,修改後代碼如下:

long startTime = System.currentTimeMillis();
long sum = 0L;
for (long i = 0; i < 100000000; i++) {
    sum += i;
}
System.out.println("計算結果: sum = " + sum);
System.out.println("共耗時 " + (System.currentTimeMillis() - startTime) + " 毫秒!");

運行結果

計算結果: sum = 4999999950000000
共耗時 33 毫秒!

可以看到,修改後的代碼運行耗時不及修改之前的十分之一。

原因

修改之前 sum 爲 Long 類型,那麼在每次執行 sum += i 的時候,由於自動裝箱,每次都會新創建一個 Long 類型的示例,在 for 循環期間,相當於新建了 100000000 個 Long 類型的對象,把 sum 改爲 long 可以避免出現新建 Long 實例,從而縮短程序執行所需小號的時間。

結論

優先使用基本類型而不是裝箱基本類型,避免創建不必要的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章