> -- Илья Ермаков писал(а):
> А вот про 2) - испытания-то показывают, что лучше не сильно большими кусками. Порциями в 1024 уже замедляет (при сотнях-тысячах запросов в секунду).
Замедляется Блэкбоксовская реализация? Это не удивительно.

Блэкбоксовская реализация осуществляя чтение опрашивает сокет периодически (вроде один раз в 50 миллисекунд), а не непрерывно. Быстро вычитывать = вычитывать непрерывно. То есть если хотите получить высокую скорость, то первое что надо сделать - выбросить блэкбоксовскую реализацию и написать свою.

Оптимальная по скорости работы реализация такова:

Сокет надо сделать блокирующим.
Надо создать два потока. Один на чтение, другой на запись.

Читающий поток (его приоритет можно поднять до максимального) постоянно спит в функции socket.Receive.
Как только в сокет поступили новые данные этот поток (обладающий высоким приоритетом) тотчас же (в туже самую "наносекунду") будится операционкой, вычитывает данные из сокетного буфера, кладёт их в "безразмерный" приёмный буфер приложения и сразу же возвращается в спячку внутри socket.Receive. Вот это и есть вычитывание "со скоростью света" -- надо чтобы приёмный сокетный буфер всё время был пустым.

Записывающий поток берёт данные из "безразмерного" отправительного буфера приложения и засовывает их в socket.Send большими порциями - сколько есть. Но слишком часто ему это делать не обязательно и даже вредно. Иногда нужно немного поспать. Если мы сказали функции Send послать много, а она послала мало, значит на приёмной стороне в приёмном сокетном буфере закончилось место, следовательно надо дать время принимающей стороне успеть его опустошить - немножко спим прежде чем вызвать socket.Send в следующий раз.