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」)