9

複雑なことを簡単でわかりやすい方法で説明する自然な才能を持っている人は、この質問に答えることができますか?JavaNIOでネットワークI/Oを実行するときに、通常のByteBufferと直接ByteBufferを使用する必要がある場合に、最高のパフォーマンスを得るにはどうすればよいですか?


例:ヒープバッファーに読み込んでそこから解析し、多くのget()(バイトごと)を実行する必要がありますか、それとも直接バッファーに読み込んで直接バッファーから解析する必要がありますか?

4

2 に答える 2

12

Java NIO でネットワーク I/O を行う場合、最高のパフォーマンスを得るには、いつ直接 ByteBuffers と通常の ByteBuffers を使用する必要がありますか?

ダイレクト バッファには多くの利点があります

  • Java とネイティブ メモリの間で渡されるデータの余分なコピーを回避します。
  • それらが再利用されると、使用されたページだけが実メモリになります。これは、必要以上に大きくすることができ、仮想メモリのみを浪費することを意味します。
  • マルチバイト プリミティブにネイティブ バイト オーダーで効率的にアクセスできます。(基本的に機械語命令1つ)

ヒープ バッファに読み込んでそこから解析し、多くの get() (バイトごと) を実行する必要がありますか、それともダイレクト バッファに読み込んでダイレクト バッファから解析する必要がありますか?

一度に 1 バイトずつ読み取っている場合は、あまり利点が得られない可能性があります。ただし、ダイレクト バイト バッファを使用すると、一度に 2 バイトまたは 4 バイトを読み取ることができ、一度に複数のバイトを効果的に解析できます。

【リアルタイム】【セレクター】

リアルタイム データを解析している場合は、セレクターの使用を避けます。ブロッキングNIOまたはビジー待機NIOを使用すると、レイテンシーのパフォーマンスが最も低くなることがわかりました(接続数が比較的少なく、たとえば最大20であると仮定)

于 2012-08-30T07:39:34.360 に答える
4

データをソケットからファイルに、またはその逆にデータをコピーするだけの場合は、ダイレクト バッファが最適です。自分でデータを見ることを計画している場合、直接バッファには意味がありません。

于 2012-08-30T00:00:09.343 に答える