簡體   English   中英

擴展java.nio.ByteBuffer的Java循環字節緩沖區

[英]Java Circular Byte Buffer that Extends java.nio.ByteBuffer

我在SO和其他地方看到過的每個Java循環字節緩沖區實現都沒有擴展java.nio.ByteBuffer,對我來說這是與SocketChannel一起使用所必需的。 有沒有人知道擴展ByteBuffer的開源實現。 我試着寫下我自己的路,但是當我意識到位置和剩余的功能是最終的時候我被卡住了,我將覆蓋那些以調整頭部並防止緩沖區溢出異常。 在通過套接字通道發送5000條消息時,每個人都需要我將東西復制到線性緩沖區的頭部,這會增加大約450毫秒或90us的每條消息(其中包含10個數據包,因此每個數據包為9us)。 現在,我能想到的唯一方法是覆蓋每一個方法並重寫所有方法。 有任何想法嗎?

您可以使緩沖區比一條消息大得多,而不是創建循環緩沖區。 假設最大消息大小為N個字節。 創建一個100 * N字節的緩沖區只有compact()ByteBuffer,當剩下少於N個字節時。 這將減少復制量100倍。

另一個優化是在沒有剩余數據的情況下壓縮()ByteBuffer,因為這非常快。

你不能擴展java.nio.ByteBuffer就這么簡單。 c-tor是包私有的。 它不起作用,b / c的主要思想是將地址傳遞給某些C代碼。 此外,您無法覆蓋任何內容,因為許多方法都是最終的。 ByteBuffers已經設計了速度,一些決定可能看起來很奇怪,但它們還可以。

java.nio.channels.GatheringByteChanneljava.nio.channels.ScatteringByteChannel值得一試,雖然有相當多的實現依賴(本機C)使它們有用。

我會利用方法ByteBuffer.wrap()。 快速了解一下先前Dean Hiller先生發布的思科實施情況,您可以用getWriteBuffer()替換put(),它會返回一個ByteBuffer,它將該部分包裝在它可以寫入的緩沖區中。

讀取部分可以應用相同的邏輯。

它的優點是不必壓縮,這可能是昂貴的,這取決於ByteBuffer中的字節數,代價是復雜的解析邏輯:你可能會得到包含最后一個的ByteBuffer的消息的第一部分底層循環緩沖區的區域。 要獲取消息的第二部分,需要另一次讀取以將循環緩沖區開頭的字節數組包裝到另一個ByteBuffer中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM