Из-за того, как работает управление перегрузкой TCP, более эффективно отправлять данные одновременно. TCP поддерживает окно того, сколько данных ему будет позволено быть «в эфире» (отправлено, но еще не подтверждено). TCP измеряет количество подтверждений, возвращающихся, чтобы выяснить, сколько данных он может иметь «в воздухе», не вызывая перегрузки (то есть потери пакетов). Если из окна приложения недостаточно данных для заполнения окна, TCP не может выполнить точные измерения, поэтому он будет консервативно уменьшать окно.
Если у вас есть только несколько небольших заголовков, и ваши вызовы на send
выполняются быстро, операционная система обычно буферизует данные для вас и отправляет их все в одном пакете. В этом случае контроль перегрузки TCP не является проблемой. Однако каждый вызов send
включает переключение контекста из пользовательского режима в режим ядра, что приводит к перегрузке ЦП. Другими словами, вам все равно лучше буферизовать в своем приложении.
Есть (по крайней мере) один случай, когда вам лучше без буферизации: когда ваш буфер медленнее, чем издержки переключения контекста. Если вы пишете сложный буфер в Python, это вполне может иметь место. Буфер, написанный на CPython, будет немного медленнее, чем точно оптимизированный буфер в ядре. Вполне возможно, что буферизация обойдется вам дороже, чем купит.
Если сомневаешься, измерить.
Одно слово предостережения: преждевременная оптимизация - корень всего зла. Разница в эффективности здесь довольно мала. Если вы еще не установили, что это узкое место для вашего приложения, сделайте все, что облегчит вашу жизнь. Вы всегда можете изменить это позже.