16

低レベルの HTTP および FTP 転送を実装するときに、最大のスループットを得るためにバッファのサイズ (ソケットから読み取ったり、ソケットに書き込んだりするバイト数) をどのように選択すればよいでしょうか? 私のアプリケーションは、130 Kbps から 3 Mbps までのさまざまな接続で HTTP または FTP を使用してデータを転送する必要があります (予想される速度は事前にわかっています)。一方通行の場合もあれば、双方向の場合もあります。平均的なバッファ サイズに固執する必要がありますか、それとも接続速度に応じて変更する必要がありますか?

ありがとう。

4

3 に答える 3

14

8KB を超えるバッファ サイズを選択します。9000 は通常、最速のネットワークでも使用される最大の MTU (最大伝送単位) サイズです。

接続の MTU より大きいバッファを使用すると、オペレーティング システムは必要に応じてバッファを MTU サイズの断片に分割するため、MTU を超えて使用するものはネットワーク パフォーマンスにほとんど影響しません。

ただし、大きなバッファを使用すると、パフォーマンスに別の影響を与える可能性があります。ファイルを転送する場合、大きなバッファを使用すると読み取りパフォーマンスが向上し、アプリケーションの速度が向上する可能性があります。

したがって、通常は 16KB などの適切なラウンド数を選択することをお勧めします。1500 を下回ることは絶対に避けてください。これは、ネットワーク パフォーマンスに悪影響を与える可能性があるためです (オペレーティング システムが小さなパケットを送信することがあり、ネットワークのパフォーマンスが低下します)。

于 2008-11-11T23:42:20.880 に答える
6

まず、いくつかの測定値を取得します。

次に、信頼できるパフォーマンス測定値を取得したら、バッファー サイズを変更し、速度とバッファー サイズのグラフをプロットします。

接続速度は事前にわかっているので、さまざまな実際のバッファー サイズで実際の速度を測定できるはずです。

OS、プロトコル スタック、およびネットワークは複雑すぎて、第一原理から答えを導き出すことはできません。何かをする前に測定する必要があります。

于 2008-11-11T23:59:50.657 に答える
0

バッファサイズを取得できます: httpSocket.getReceiveBufferSize(); 読み取りの過程で、このバッファを RAM に書き込むことを強くお勧めします。例: ByteArrayOutputStream メモリファイル。バッファがいっぱいになった後でのみ、ディスクに書き込みます。

于 2019-01-27T06:31:16.943 に答える