您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java緩沖區類型與原生數組哪個垃圾回收更快”,在日常操作中,相信很多人在Java緩沖區類型與原生數組哪個垃圾回收更快問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java緩沖區類型與原生數組哪個垃圾回收更快”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
使用 C 語言開發時,必須手動分配和釋放內存,這是一個容易出錯的過程。相反,像 Java 這樣的之后的一些語言通常會自動管理內存。Java 依賴于垃圾回收。實際上,內存是根據需要來分配,然后 Java 發現哪些數據不再訪問,并回收相應的內存。垃圾回收過程既快速又安全,但是它不是免費的:盡管進行了數十年的優化,但它仍然可能給開發人員帶來一些麻煩。
Java 具有原生數組(例如 int[] 類型),這些數組通常在 Java 堆上分配。也就是說,它們由 Java 作為動態數據進行分配和管理,并進行垃圾回收。
Java 還具有 Buffer 類型,如 IntBuffer,它是一種高級抽象,可以由原生 Java 數組實現,也可以由其他數據源(包括 Java 堆外數據)來實現。因此,可以使用 Buffer 類型來避免過多地依賴 Java 堆。
與原生數組相比,Buffer 會存在一定性能損失。我不是說 Buffer 慢。事實上,如果在 Buffer 和流(DataInputStream)之間做一個選擇,你應該更傾向于 Buffer 類型。然而,根據我的經驗,Buffer 在性能方面不如原生數組。
我可以用 new int[50000] 或 IntBuffer.allocate(50000) 來創建一個包含 50,000 個整數的數組。后者本質上應該是創建一個數組(在 Java 堆上),然后用 IntBuffer 接口來包裝。
一個可能的直覺是,用高級接口包裝一個數組應該是免費的。雖然高層次的抽象確實可以不帶來性能上的損失(有時甚至可以帶來性能上的提升),但是否會帶來性能上的提升是一個經驗問題。你絕對不應該只是假設你的抽象是免費得來的。
因為我在做一個經驗陳述,但我可以用最簡單的測試來證明它,比如給數組 以及 IntBuffer 中的每個元素加 1。
for(int k = 0; k < s.array.length; k++) { s.array[k] += 1;}
for(int k = 0; k < s.buffer.limit(); k++) { s.buffer.put(k, s.buffer.get(k) + 1);}
我在臺式機(OpenJDK 14,4.2 GHz Intel 處理器)上得到結果如下:
也就是說,在此測試中,數組比 IntBuffers 快 4 倍以上。
如果有興趣,你也可以自己運行以下基準測試。
https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/2020/11/30
我的看法是,Java 針對數組的許多優化不適用于 Buffer 類型。
當然,我們無法得知 Buffer 從 Java 堆外映射時發生了什么,根據我的經驗,情況可能很糟。
Buffer 類型并不會讓原生數組過時,至少在性能方面。
到此,關于“Java緩沖區類型與原生數組哪個垃圾回收更快”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。