Windowsでは、このrecv
関数を使用してソケットからデータを受信しているとしましょう。最適なバッファの大きさに興味がありますか?バイトにすることも、1024
バイト以上にすることもでき51200
ます。どちらがパフォーマンスに優れているのだろうかと思います。
recv
これは関数だけに当てはまるわけではありません。たとえば、大きなテキストファイルを読んでいる場合、非常に大きなバッファが必要ですか、それとも小さなバッファが必要ですか。
オペレーティングシステムは独自のバッファリングを実行するため、バッファのサイズは実際には重要ではありません。パフォーマンスの低下は関数呼び出しにあります。1バイトのバッファーは、への呼び出しが多すぎるため、非効率になりますrecv()
。バッファが大きすぎると、スペースが無駄になります。
最適なサイズは、1回の呼び出しで受信または処理できると予想されるデータの2倍のサイズであり、recv()
下限は約1または2tcpフレームです。
私は個人的に4KBのバッファーを使用していますが、それは私自身の好みであり、作成しているアプリケーションに大きく依存します。
オペレーティングシステムはすでにそれをバッファリングしているので、一度に1バイトだけ読み取る方がよいでしょう。
これは、期待するデータの種類と期待するプロトコルによって異なります。たとえば、UDPはパケット全体を一度に提供するため、最適なバッファサイズは1500になります。
実際のパフォーマンスの障害は、実行する関数呼び出し(recv
この場合)です。パフォーマンスを向上させるために、デフォルトの大きな値から始めて、受信しているパケットサイズを分析することができます。分析に基づいて、(ほぼ)「理想的な」バッファサイズを渡すことができます。
サーバーで実行するサービスがわからないサーバータイプの状況では、[128,1024,4096,16384,65536]などのさまざまなサイズのバッファープールの配列を使用できます。何かが接続されたら、128サイズを使用し、128がすべて入った場合は、次回は1024を使用します。
既知のプロトコル/ロードを備えたクライアントまたはサーバーでは、それを推測してください(他のポスターで示唆されているように:)
Rgds、マーティン