10

Java で TCP を介して最速の転送速度を得るには、こちらの方が優れています。

オプション A:

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

オプション B:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

8 KiB を超えて OutputStream に書き込むとパフォーマンスが低下することを読みましたが、一度に 8 KiB を超えるのではなく、小さなチャンクで書き込むことをお勧めしました。8 KiB は、BufferedOutputStream のデフォルトのバッファー サイズです。

ただし、ネット経由でデータを転送するときは、できるだけ早くバイトをフラッシュするのが良いことも読んだことがあります。バッファを使用して小さなチャンクで書き込むと、不要なオーバーヘッドが追加されることを意味します。

では、選択肢 A か選択肢 B か。どれが一番うまくいきますか?

現時点では、オプション A がオプション B よりもはるかに多くの CPU を消費しながら最高の転送速度を提供すると推測しています。

--

おまけの質問: TCP ウィンドウ サイズに手を加えるのは良い考えですか? たとえば、64 KiB に設定すると、次のようになります。

socket.setReceiveBufferSize(65536);
socket.setSendBufferSize(65536);

速度を上げることができると読んだので、テストマシンで128 KiBに設定しようとしましたが、サーバーがいくつかの接続を取得したとき、CPUは放置したときのように〜2%ではなく100%でした. トラフィックの急増を処理できる優れたサーバーがない限り、128 KiB は高すぎると思いますが、32 KiB のような値に設定するのは賢明でしょうか? 私の場合、デフォルトは 8 KiB だったと思います。

(「ソケット」は「java.net.Socket」)

4

1 に答える 1

8

どこでナンセンスなことを読んだのかわかりませんが、完全に前後しています。一度に TCP 接続に書き込むほど良くなり、一度に読み取る量も増えます。私は常に、アプリケーションとソケット ストリームの間でバッファ ストリーム、リーダー、またはライターを使用します。SSL のように、一度に 1 バイトずつ直接書き込むと 40 倍のデータ爆発が発生する場合があります。

TCP ウィンドウ サイズに触れるのは良い考えですか? たとえば、64 KiB に設定することで

「TCPウィンドウサイズに触れる」ことはできません。言及した API を介して最大値を増やすことができますが、それは確かに良い考えです。

于 2012-07-08T08:00:00.550 に答える