2011-12-13 46 views
1

假設我們有通用串行,並且我們正在監聽傳入字節。假設寫入速度超過,並且爲了不從串口中釋放字節,我們引入了緩衝區,然後執行下一步。串行監聽器只是將字節放入緩衝區(緩衝區寫入線程)和緩衝區讀取器以從緩衝區(緩衝區讀取線程)提取字節並分析數據。性能:並行連接隊列<Integer>作爲串行輸入緩衝區

如何有效的是用java 1.5 ConcurrentLinkedQueue<Integer>考慮到裝箱和拆箱,同時從串行基本int incomingByteQueue<Integer>之間切換?

限制:

  1. 沒有緩衝區大小限制

我知道,像int[] buffer[BUFFER_SIZE]往往是固定大小的緩衝區被使用,但我想不會有緩衝極限的限制。

  1. 線程安全

最好是有線程安全箱子外面和不同步使用封閉液或者不服手動線程。

回答

1

什麼是您的設備的字節/秒的傳輸速度?如果它每秒不到1 MB,那麼你採用哪種方法可能並不重要。


如果你正在寫字節,爲什麼不使用ConcurrentLinkedQueue<Byte>每個可能的字節值緩存,因此只存在於自動裝箱和拆箱的名義成本。

主要性能瓶頸是隊列中的鏈接條目。每個字節仍然會創建一個對象(它是列表中的節點),每個對象使用大約16個字節。換句話說,你可以使你的尺寸增大16倍,並且它會使用相同數量的內存並創造更少的垃圾。

滿足你的要求,你可以使用ConcurrentLinkedQueue<Byte>,但創造一個byte[]的環形緩衝區會更快(而且容易使重相當大的)

如果發送更多的10 MB/s的我會建議編寫ByteBuffer並與另一個線程交換(即,一次傳輸大塊)

+1

該代碼預計可在Android設備上運行。所以發送者可以是PC(寫入端口),並且接收器可以是非常慢的設備(從端口讀取)。字節隊列比整數隊列好,但環形緩衝區是我認爲最好的選擇。謝謝 – Anton