Java 效能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)
【編者按】本文作者為 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個引用變數(包裝類)。
下面的程式碼會介紹”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
相關文章
- Java 效能筆記:自動裝箱/拆箱Java筆記
- Java自動拆箱與裝箱Java
- Java的自動裝箱和拆箱Java
- Java中的自動裝箱與自動拆箱Java
- Java中的自動裝箱與拆箱Java
- Java自動裝箱/拆箱 - Java那些事兒Java
- java裝箱拆箱Java
- 如何理解Java中的自動拆箱和自動裝箱?Java
- Java語法糖2:自動裝箱和自動拆箱Java
- Java 自動裝箱效能Java
- Java學習之自動裝箱和自動拆箱原始碼分析Java原始碼
- 通過原始碼瞭解Java的自動裝箱拆箱原始碼Java
- 【java】JDK5的新特性→→自動裝箱和拆箱JavaJDK
- Integer 自動拆箱封箱
- java中的內部類和自動拆裝箱Java
- 深入理解Java之裝箱與拆箱Java
- 深入剖析Java中的裝箱和拆箱Java
- [JAVA] Java物件導向之包裝類,拆箱、裝箱Java物件
- C#之拆箱,裝箱C#
- c#的裝箱和拆箱C#
- java空指標出現的情況:拆箱裝箱Java指標
- 談談JavaScript中裝箱和拆箱JavaScript
- 資料型別及拆箱裝箱資料型別
- Visual C#裝箱與拆箱C#
- Java無意識自動裝箱嚴重消耗效能Java
- 深入淺出瞭解“裝箱與拆箱”
- 一文讀懂什麼是Java中的自動拆裝箱Java
- 夯實Java基礎系列2:Java自動拆裝箱裡隱藏的秘密Java
- 基礎鞏固、探尋Java裝箱和拆箱的奧妙!Java
- 深入理解C#的裝箱和拆箱C#
- Java基本型別自動裝箱的效能成本 -Coffee TalkJava型別
- dotnet學習筆記一 - 裝箱拆箱 (轉)筆記
- Effective C#:儘量減少裝箱和拆箱C#
- .NET Core CSharp 中級篇 2-1 裝箱與拆箱CSharp
- 記一次Java自動拆箱引發的空指標問題Java指標
- 夯實Java基礎系列2:Java基本資料型別,以及自動拆裝箱裡隱藏的秘密Java資料型別
- java基礎(八) 深入解析常量池與裝拆箱機制Java
- 夯實Java基礎系列2:Java基本資料型別,以及自動拆裝箱裡隱藏的祕密Java資料型別