Intereting Posts
Перетаскивание по фиксированному контейнеру меняет свой размер Оценить токен препроцессора перед ## конкатенацией Почему программа печатает 0s? Проверьте, объявлена ​​ли функция с препроцессором C? Может быть неопределенное поведение, которое будет следовать за поведением программы getc (), если getc () выходит через SIGINT Какой самый простой способ захватить веб-страницу в C? Предупреждение: игнорирование возвращаемого значения «scanf», объявленного с помощью атрибута warn_unused_result Как получить diff одного файла с libgit2? Шифрование IP-адресов с шестнадцатеричным IP-адресом Уточняют ли указатели на функции конвейер команд? Как обнаружить нажатия клавиш в программе GUI Linux C без запроса пользователя? Неподписанные / подписанные арифметические задачи из учебника перспективных программистов Массивы указателей и постоянное запоминающее устройство в C Циклические столбцы матрицы В настоящее время выполняется ошибка при ошибке подключения (функции)

Размер буфера Windows

В windowsх можно сказать, что я использую функцию recv для приема данных из сокета. Мне любопытно, насколько большой будет оптимальный буфер? Я мог бы сделать его 1024 байта, или я мог бы сделать его 51200 байт или больше. Мне интересно, какой из них лучше для производительности.

Это относится не только к функции recv , скажем, что я читаю большой текстовый файл, нужен ли мне очень большой буфер или меньший буфер?

Операционная система выполняет собственную буферизацию, поэтому размер вашего буфера не имеет большого значения. штраф за исполнение заключается в вызове функции: буфер 1 байт будет неэффективным, потому что для вызова recv() потребуется слишком много вызовов. слишком большой буфер – это просто пустая трата пространства.

оптимальный размер будет примерно вдвое превышать размер данных, которые вы ожидаете получить или сможете обрабатывать одним вызовом recv() , с нижним пределом приблизительно 1 или 2 кадра tcp.

Я лично использую буфер 4 КБ, но это мое предпочтение, и это во многом зависит от приложения, которое я пишу.

Операционная система уже буферизует его, поэтому вы могли бы просто прочитать один байт в то время.

Это будет зависеть от того, какие данные вы ожидаете, и от протокола, который вы ожидаете. UDP, например, даст вам целый пакет за один раз, поэтому оптимальный размер буфера может составлять 1500.

Реальным препятствием производительности будет вызов функции ( recv в этом случае), который вы сделаете. Чтобы повысить производительность, вы можете начать с большого значения по умолчанию, а затем проанализировать полученные размеры пакетов. Основываясь на анализе, вы можете передать (почти) «идеальный» размер буфера.

Если у вас ситуация с типом сервера, когда вы не знаете, какие службы должны быть запущены на нем, вы можете использовать массив пулов буферов различного размера, например [128,1024,4096,16384,65536]. Когда что-то соединяется, используйте размер 128 и, если все 128 приходят, используйте 1024 в следующий раз .. и так далее.

На клиентах или серверах с известным протоколом / загрузкой просто догадайтесь об этом (как это было предложено другими плакатами 🙂

Rgds, Martin