2

基本的に、私の状況はこれです:

  1. サーバーは、クライアント接続からinQueueByteBufferというオブジェクトにデータをストリーミングします。これには、最新のデータストリームが含まれます
  2. サーバーは、これらの各ストリームのデータを処理し、特定の形式のデータのパケットを期待する必要があります
  3. byte[]データのペイロードはオブジェクトに読み込まれ、個別に処理されます

さて、私の質問はこれに要約されます: 残りのバッファデータ(ペイロード)をbyte[]配列にコピーすることはパフォーマンスに悪いですか?

外観は次のとおりです。

// pretend we're reading the packet ID and length
// int len = LENGTH OF PACKET PAYLOAD

/* 
 * Mark the starting position of the packet's payload.
 */
int pos = inQueue.position();

byte[] payload = new byte[len];
inQueue.get(payload);

// Process the packet's payload here

/*
 * Set the inQueue buffer to the length added to the previous position
 * so as to move onto the next packet to process.
 */
inQueue.position(pos + len);

ご覧のとおり、私は基本的にこれを行っています。

  1. ペイロードの直前のバッファ全体の位置をマークします
  2. byte[]ペイロードが別のオブジェクトに送られる限り、inQueueの内容をコピーします
  3. より多くのパケットを読み取ることができるように、完全なバッファの位置を、読み取ったばかりのペイロードの後に​​設定します

私の懸念は、これを行う際に、バッファをコピーすることによってメモリを浪費していることです。使用されるパケットは500バイトを超えることはなく、多くの場合100バイト未満であることに注意してください。

私の懸念は有効ですか、それとも私はパフォーマンスに偏っていますか?:p

4

2 に答える 2

1

あなたはそれを避けるべきです。これが、ByteBufferの設計の理由です。データのコピーを避けるためです。

「ここでペイロードを処理する」とはどういう意味ですか?

そこで何が起こっても少し再配置すれば、ByteBufferで直接それを行うことができ、flip()最初に1つ以上を呼び出しget()て必要なデータを取得し、compact()その後(clear()空であることが確実な場合)、さらに別のbyte[]配列への中間コピーステップ。

于 2012-07-18T04:07:26.873 に答える
0

これは不要なだけでなく、質問に答えると、スケールアップしてもパフォーマンスの変化に気付くことはありません。

于 2012-07-17T20:23:18.667 に答える