TCP 輻輳制御の仕組みにより、一度にすべてのデータを送信する方が効率的です。TCP は、「空中」 (送信されたがまだ確認応答されていない) を許可するデータの量のウィンドウを維持します。TCP は、戻ってくる確認応答を測定して、輻輳 (つまり、パケット損失) を引き起こさずに「空中」に保持できるデータ量を把握します。ウィンドウを埋めるのに十分なデータがアプリケーションから送信されない場合、TCP は正確な測定を行うことができないため、控えめにウィンドウを縮小します。
少数の小さなヘッダーしかなく、への呼び出しがsend
立て続けに行われる場合、オペレーティング システムは通常、データをバッファリングし、すべてを 1 つのパケットで送信します。その場合、TCP 輻輳制御は実際には問題になりません。ただし、 への各呼び出しにsend
は、ユーザー モードからカーネル モードへのコンテキスト スイッチが含まれるため、CPU オーバーヘッドが発生します。言い換えれば、アプリケーションでバッファリングする方が良いということです。
バッファリングを使用しない方がよい場合が (少なくとも) 1 つあります。それは、バッファがコンテキスト切り替えのオーバーヘッドよりも遅い場合です。Python で複雑なバッファーを作成する場合は、その可能性が非常に高くなります。CPython で書かれたバッファは、カーネルで細かく最適化されたバッファよりもかなり遅くなります。バッファリングは、購入するよりも多くの費用がかかる可能性があります。
迷ったら測る。
時期尚早の最適化は諸悪の根源です。ここでの効率の違いはかなり小さいです。これがアプリケーションのボトルネックであることをまだ確認していない場合は、作業を楽にする方法を選択してください。後でいつでも変更できます。