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

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

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


person Josh    schedule 28.09.2011    source источник


Ответы (4)


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

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

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

person Adrien Plisson    schedule 28.09.2011

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

person Juho    schedule 28.09.2011
comment
Одно переключение контекста на байт не даст вам лучших в своем классе наград за производительность... - person Jörgen Sigvardsson; 28.09.2011

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

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

person Aditya Sehgal    schedule 28.09.2011

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

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

С уважением, Мартин

person Martin James    schedule 28.09.2011