Есть ли разница в производительности между Begin * и * Async для сокетов в .NET? - PullRequest
17 голосов
/ 05 марта 2011

Мое приложение должно быстро передать сообщение большому количеству клиентов (1000 с) и собрать результаты.

Я думаю, стоит ли использовать BeginSend / EndSend и т. Д.семейства функций или использование семейства SendAsync - есть ли разница в производительности?В чем их отличие, за исключением семейства * Async, не требующего выделения IAsyncResult?

Если я правильно понимаю, они оба используют порты завершения ввода-вывода и стандартный пул потоков .net ... Итаккакая разница?

1 Ответ

18 голосов
/ 05 марта 2011

Разница только в используемом шаблоне.

SendAsync в фактах используется Шаблон на основе событий .BeginSend и EndSend используют шаблон IAsyncResult .

РЕДАКТИРОВАТЬ: Я не знаю, как интерфейс IAsyncResult реализован в классе Socketно вот документ от MSDN, в котором объясняется, когда следует применять тот или иной шаблон.

Отрывок из последней части:

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

Существует три сценария, в которых шаблон на основе событий неaddress, а также шаблон IAsyncResult:

  1. Блокировка ожидания на одном IAsyncResult

  2. Блокировка ожидания на многих объектах IAsyncResult

  3. Опрос на завершение в IAsyncResult

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

Разработчики часто используют шаблон IAsyncResult для сервисов, которые обычно предъявляют очень высокие требования к производительности.Например, сценарий опроса завершения - это высокопроизводительный серверный метод.

Кроме того, шаблон на основе событий менее эффективен, чем шаблон IAsyncResult, поскольку он создает больше объектов, особенно EventArgs, и потому, что он синхронизируется междуthreads.

В следующем списке приведены некоторые рекомендации, которым необходимо следовать, если вы решите использовать шаблон IAsyncResult:

  • Предоставлять шаблон IAsyncResult можно только в том случае, если вам специально требуется поддержка WaitHandle илиОбъекты IAsyncResult.

  • Предоставляйте шаблон IAsyncResult только при наличии существующего API, который использует шаблон IAsyncResult.

  • При наличии существующего APIосновываясь на шаблоне IAsyncResult, рассмотрите возможность предоставления шаблона на основе событий в следующем выпуске.

  • Предоставляйте шаблон IAsyncResult только в том случае, если у вас есть высокие требования к производительности, которые, как вы убедились, не могут быть выполненышаблон на основе событий, но может быть мet по шаблону IAsyncResult.

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