C Размер буфера Windows - PullRequest
       23

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

2 голосов
/ 28 сентября 2011

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

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

Ответы [ 4 ]

3 голосов
/ 28 сентября 2011

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

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

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

0 голосов
/ 28 сентября 2011

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

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

Rgds, Martin

0 голосов
/ 28 сентября 2011

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

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

0 голосов
/ 28 сентября 2011

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

...