1

共通のシリアルがあり、着信バイトをリッスンしているとしましょう。書き込み速度が読み取り速度を上回っているとしましょう。シリアルからバイトを失わないようにするために、バッファを導入して次のことを行います。シリアル リスナーは、バイトをバッファー (バッファー ライター スレッド) とバッファー リーダーに配置して、バッファーからバイトを抽出し (バッファー読み取りスレッド)、データを分析します。

プリミティブConcurrentLinkedQueue<Integer>int incomingByteシリアルとQueue<Integer>.

制限:

  1. バッファサイズ制限なし

多くの場合、固定サイズのバッファーが使用されることは知っていint[] buffer[BUFFER_SIZE]ますが、バッファー制限の制限を設けたくないのです。

  1. スレッドセーフ

すぐに使用できるスレッド セーフを使用し、ブロッキング バッファーまたはスムスを使用してスレッドを手動で同期しない方がよいでしょう。

4

1 に答える 1

1

デバイスのバイト/秒単位の転送速度は? 1 秒あたり 1 MB 未満の場合は、おそらくどちらのアプローチをとっても問題ありません。


バイトを書き込んでいる場合は、ConcurrentLinkedQueue<Byte> 可能な限りすべてのバイト値がキャッシュされるため、自動ボクシングとボックス化解除の概念的なコストのみが発生します。

主なパフォーマンスのボトルネックは、キュー内のリンクされたエントリです。バイトごとにオブジェクト (リスト内のノード) が作成され、各オブジェクトは約 16 バイトを使用します。言い換えれば、byte[]16x を大きくすることができ、同じ量のメモリを使用し、ガベージを減らすことができます。

要件を満たすために、 を使用することもできますがConcurrentLinkedQueue<Byte>、 のリング バッファを作成するbyte[]方が高速です (そして、サイズ変更可能にするのは簡単です)。

10 MB/s 以上を送信している場合は、ByteBuffer を記述して別のスレッドと交換することをお勧めします (つまり、一度に大きなブロックを転送しているため)。

于 2011-12-13T13:59:20.617 に答える