2011-06-13 53 views
10

我需要一個Java中的字節緩衝區類用於單線程使用。當緩衝區滿時,緩衝區應該調整大小,而不是拋出異常或其他東西。對我來說非常重要的問題是性能。什麼是Java中最好的可調整大小的字節緩衝區?

你會推薦什麼?

添加: 在momement我使用ByteBuffer,但它不能調整大小。我需要一個可以調整大小的。

+0

備註:微字符標記和字節緩衝區註釋:http://www.evanjones.ca/software/java-bytebuffers.html – miku 2011-06-13 10:46:26

+0

如何將性能和單線程結合使用,普通字節[]容易。 – bestsss 2011-06-13 10:48:36

+1

不能使用byte [],因爲我不知道要寫入的數據的長度。 – Worker 2011-06-13 10:53:20

回答

9

任何理由不使用無聊的正常ByteArrayOutputStream

正如以上miku提到的,Evan Jones gives a review of different types並表明它是非常依賴於應用程序的。所以不知道更多的細節,很難推測。

我會從ByteArrayOutputStream開始,並且只有在分析顯示它是您的性能瓶頸轉移到其他東西時。通常當你認爲緩衝區代碼是瓶頸時,它實際上就是網絡或其他IO--等到性能分析表明你需要進行優化,然後再浪費時間找到替代品。

如果要移動到別的東西,那麼其他的因素,你需要考慮:

  • 你說你正在使用單線程應用,所以不需要BAOS的同步
  • 什麼緩衝區被填充並送入?如果任一端已經連線使用Java NIO,那麼使用直接ByteBuffer是非常有效的。
  • 您使用循環緩衝區還是普通線性緩衝區?如果你是Ostermiller Utils是非常有效的,並且GPL'd
+0

它遠離最好的 – bestsss 2011-06-13 10:47:34

+0

它是同步的 - 可能會對性能產生一定影響。 – Worker 2011-06-13 10:52:31

+0

@MinimeDJ - 我不確定你在做什麼,但是「可能會對性能產生一定影響」與「存在性能問題」相去甚遠。 – 2011-06-13 11:04:13

2

你可以使用一個直接的ByteBuffer。直接內存使用虛擬內存開始只在應用程序使用時分配給應用程序。即它使用的主存儲器的數量會自動重新調整大小。

創建一個比你需要的直接的ByteBuffer大,它只會消耗你使用的東西。

+0

不錯,自動爲頁面錯誤:D但直接內存的數量是有限的(雖然它可以設置得足夠高,但)。 DirectByteBuffers需要彙集,因爲它們的分配相當昂貴,尤其是解除分配。 – bestsss 2011-06-13 11:16:21

2

您也可以編寫手動代碼來連續檢查緩衝區內容,如果它已滿,則創建一個更大的新緩衝區並移動新緩衝區中的所有數據。