HttpWebRequest и HttpWebResponse идеальные размеры асинхронного буфера - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь использовать HttpWebRequest и HttpWebResponse в .NET 3.5, запуская их в асинхронном режиме: BeginGetRequestStream, EndGetRequestStream, BeginWrite, EndWrite, BeginGetResponse, EndGetResponse, BeginRead, BeginRead * EndRead - все эти операции обрабатываются как части синхронизации.

У меня есть несколько потоков, которые отправляют большое количество одновременных запросов. EndRead и EndWrite являются блокирующими операциями - они блокируют текущий поток, в то время как фактическое чтение / запись в потоке завершено, я пытаюсь найти идеальный размер буфера ввода / вывода для этих операций.

Мое рассуждение таково: поскольку у меня одновременно активны несколько запросов, они будут продолжать вызывать обратные вызовы, чтобы поток узнал, что есть некоторые доступные данные или данные были отправлены. Если у меня большие буферы, чтение / запись данных через провод займет больше времени, поэтому EndRead / EndWrite будет блокироваться дольше. Это заставило бы другие запросы в том же потоке ждать немного дольше, так как их уведомления должны будут ждать, пока поток не будет разблокирован.

Итак, мой вопрос, какой будет хороший размер буфера для чтения / записи в этой ситуации. Я думал о 2048 байтах каждый, но некоторые примеры кода, которые я видел в разных блогах, показывают совершенно разные значения.

Заранее спасибо за любые идеи.

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Я думаю, что лучшим решением было бы не слишком беспокоиться о размерах буфера, но не блокировать потоки.Если вы передадите делегат параметру callback методов Begin*, этот обратный вызов будет выполнен после завершения операции, и вы сможете оттуда вызвать End*, который (почти) немедленно вернется.Блокировка не требуется.

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

1 голос
/ 05 октября 2011

Нет определенного правила относительно фактических значений, которые вы должны установить, кроме того, чтобы избегать очевидных крайностей. Это действительно зависит от типа данных, которые вы передаете, и от того, сколько их там. Возможно, вы хотите установить буфер записи достаточно высоко, но оставьте буфер чтения ниже. Это связано с тем, что записи (как правило) дороже, чем чтение, когда дело доходит до такого рода вещей.

Лучше всего в этой ситуации попробовать несколько значений и посмотреть, насколько хорошо они масштабируются. Вы всегда можете изменить их позже, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...