Я изучаю асинхронное программирование сокетов на C#, и я узнал, что это хорошая идея для повторного использования байт-буферов в каком-то пуле, а затем просто проверяйте его при необходимости при получении данных из сокета.Один большой байтовый буфер или несколько небольших?
Тем не менее, я видел два разных метода создания байтового массива: один использовал простую систему очередей и просто добавлял/удалял их из очереди по мере необходимости. Если запрос был запрошен и больше не осталось в очереди, создается новый массив байтов.
Другой метод, который я видел, использует один большой байтовый массив для всей программы. Идея очереди все еще применяется, но вместо этого она представляет собой очередь целых чисел, которые определяют срез (смещение) массива байтов для использования. Если запрос был запрошен и больше не осталось в очереди, массив должен быть изменен.
Какой из них является лучшим решением для масштабируемого сервера? Мой инстинкт заключается в том, что было бы дешевле использовать много байт-массивов, потому что я предполагаю, что изменение размера массива по мере необходимости (даже если мы будем выделять его крупными кусками) будет довольно дорогостоящим, особенно когда оно станет большим. Использование нескольких массивов также кажется более интуитивным - есть ли какое-то преимущество в использовании одного массива, о котором я не думаю?
Хороший звонок, с обязательным предупреждением не делать такие вещи, как «if (queue.Count> 0) {... dequeue ...}». – user7116
Прочтите ссылку: этот конкретный сценарий является одной из целей проектирования представленной реализации ThreadsafeQueue. –