Java 效能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)

OneAPM官方技術部落格發表於2016-04-19

【編者按】本文作者為 Ali Kemal TASCI,最早於2016年4月9日釋出於DZONE社群。文章主要介紹通過改進 Java 1.5 就已存在的骨灰級特性大幅度提高應用效能

本文系 OneAPM 工程師編譯呈現,以下為正文。

如果我告訴你:“只要修改一個字元,下面這段程式碼的執行速度就能提高5倍。”,你覺得可能麼?

long t = System.currentTimeMillis();
Long sum = 0L;for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms");

輸出結果: 總數:2305843005992468481 處理時間:6756 ms

仔細琢磨一下,你可能會想到下面這種執行速度更快的實現方法:

long t = System.currentTimeMillis();//Long sum = 0L;long sum = 0L;for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

輸出結果: 總數:2305843005992468481 處理時間:1248 ms

其實,自動裝箱(Autoboxing)的草率使用是造成速度差異的根本原因,而這一特性從 Java 1.5 開始就已出現了。

在繼續解釋造成差異的細節之前,讓我們仔細回味一下 Java 中的這兩個概念:自動裝箱(Autoboxing)與 拆箱(Unboxing)。

Java 中的變數分為兩種:原始型與引用型。一共存在8個原始型變數以及與各個原始變數對應的8個引用變數(包裝類)。

enter image description here

下面的程式碼會介紹”Autoboxing“與”Unboxing“的用例。在這段程式碼中,一個型別為”long”的值被新增到型別為”Long“的List集合中。在 Java 1.4 中,為了實現此操作,我們必須將原始變數賦值到合適的引用類中(也即裝箱,boxing)。從 Java 1.5 開始,編譯器會幫我們完成這一操作。所以,我們不再需要寫那麼多程式碼。

List<Long> longList = new ArrayList<>();      
long i = 4;
longList.add( i ); //autoboxing      long j = longList.get( 0 ); //unboxing

從 Java 1.5 開始,編譯器會自動將上面的程式碼段轉化成如下程式碼:

List<Long> longList = new ArrayList<>();      
long i = 4;
longList.add(Long.valueOf( i ) );      
long j = longList.get( 0 ).longValue();

因此,我們也可以說,前文出現的第一段程式碼段會自動轉化為如下程式碼。所以,導致處理時間較長的原因也就水落石出了:不必要地建立了2147483647個”Long“型別例項。

long t = System.currentTimeMillis();
Long sum = 0L;for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += new Long(i);
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

由此可知,想要編寫速度更快的 Java 程式碼,我們也需要考慮”Autoboxing”與”Unboxing”這樣的基礎概念。

相關資源集錦

Autoboxing and Unboxing Autoboxing Efective Java 2nd Edition, J. Bloch

OneAPM 為您提供端到端的 Java 應用效能解決方案,我們支援所有常見的 Java 框架及應用伺服器,助您快速發現系統瓶頸,定位異常根本原因。分鐘級部署,即刻體驗,Java 監控從來沒有如此簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格

本文轉自 OneAPM 官方部落格

原文地址:https://dzone.com/articles/java-performance-notes-autoboxing-unboxing

相關文章