9

SO などで参照されているすべての Java 循環バイト バッファー実装は、java.nio.ByteBuffer を拡張していません。これは、SocketChannel で使用するために必要です。ByteBuffer を拡張するオープン ソースの実装を知っている人はいますか。私は自分で書いてみましたが、位置と残りの関数が最終的なものであり、それらをオーバーライドしてヘッドを調整し、バッファオーバーフローの例外を防ぐことに気付いたときに行き詰まりました。ソケット チャネルを介して 5000 のメッセージを送信すると、すべてのメッセージがリニア バッファーの先頭にコピーする必要があり、メッセージあたり約 450ms または 90us (10 パケットを含むため、パケットあたり 9us) が追加されます。現在、私が考えることができる唯一の方法は、すべてのメソッドをオーバーライドしてすべてを書き直すことです。何か案は?

4

4 に答える 4

7

java.nio.ByteBufferを拡張することはできません。そのように単純です。c-torはパッケージプライベートです。それは機能しません、b/c主なアイデアはアドレスをいくつかのCコードに渡すことです。また、メソッドの多くはfinalであるため、何もオーバーライドできません。ByteBuffersは速度を重視して設計されており、一部の決定は奇妙に見えるかもしれませんが、問題はありません。

java.nio.channels.GatheringByteChannel試してjava.nio.channels.ScatteringByteChannelみる価値はありますが、それらを便利にするために実装にかなり依存しています(ネイティブC)。

于 2011-03-04T10:00:48.980 に答える
7

循環バッファーを作成する代わりに、バッファーを 1 つのメッセージよりも大きくすることができます。メッセージの最大サイズが N バイトだとします。100 * N バイトのバッファーを作成します。残りが N バイト未満の場合は、ByteBuffer を compact() するだけです。これにより、コピーの量が 100 分の 1 に減少します。

もう 1 つの最適化は、データが残っていないときはいつでも ByteBuffer を Compact() することです。これは非常に高速です。

于 2011-03-04T07:45:18.143 に答える
2

Apacheライセンスなので、これを試すかもしれません

https://svn.apache.org/repos/asf/etch/releases/release-1.0.0/util/src/main/java/etch/util/CircularByteBuffer.java

于 2013-04-09T16:12:00.987 に答える