DataInputStream はバッファリングされないため、DataInputStream
オブジェクトに対する各読み取り操作は、基盤となるソケット ストリームで 1つ以上の読み取りを実行し、複数のシステム コール (または同等の呼び出し) が発生する可能性があります。
通常、システム コールは、通常のメソッド コールよりも 2 ~ 3 桁高くなります。バッファリングされたストリームは、通常のメソッド呼び出しのレイヤーを追加することを犠牲にして、システム呼び出しの数を (理想的には 1 に) 減らすことによって機能します。通常、バッファリングされたストリームを使用すると、N 個の syscall が 1 個の syscall と N 個の追加のメソッド呼び出しに置き換えられます。N が 1 より大きい場合、あなたの勝ちです。
したがって、ソケット ストリームと DataInputStream の間に BufferedInputStream を配置してもうまくいかない唯一のケースは次のとおりです。
- アプリケーションが 1 つの呼び出しのみを行い
read...()
、それが 1 つのシステムコールで満たされる場合、
- アプリケーションが大規模な
read(byte[] ...)
呼び出しのみを行う場合、または
- アプリケーションが何も読み取らない場合。
これらはあなたの場合には当てはまらないようです。
さらに、それらが適用されたとしても、必要のないときに BufferedInputStream を使用するオーバーヘッドは比較的小さいです。必要なときに BufferedInputStream を使用しない場合のオーバーヘッドは、非常に大きくなる可能性があります。
最後のポイントとして、読み取られるデータの実際の量 (つまり、メッセージのサイズ) は、バッファありとバッファなしの難問とはほとんど関係がありません。本当に重要なのは、データを読み取る方法です。つまり、アプリケーションが行う一連のread...()
呼び出しです。