Новые асинхронные методы и производительность - PullRequest
6 голосов
/ 03 июня 2011

У классов сокетов в .NET появились новые асинхронные методы (например, Socket.ReceiveAsync).

Я пытаюсь понять их назначение.Насколько я понимаю, они были созданы, чтобы избежать создания нового IAsyncResult объекта для каждой операции.

Допустим, я должен был создать высокопроизводительный HTTP-сервер.Затем мне нужно создать объект запроса или ответа для каждой операции.И объекты запроса или ответа, безусловно, имеют некоторые свойства, которые могут быть и другими классами (или просто примитивами + строка).И мне, возможно, придется получать информацию из базы данных (больше объектов для создания).

Моя точка зрения заключается в том, что довольно много объектов может быть создано за запрос / ответ.Являются ли объекты AsyncResult настолько тяжелыми, что это повлияет на производительность всего сервера?Или MS означает, что я должен использовать шаблон flyweight (повторное использование объектов запроса / ответа вместо выделения новых) для всех моих объектов на сервере?

Пожалуйста, просветите меня.

Обновление

Из MSDN о новых асинхронных методах:

Главной особенностью этих улучшений является предотвращение повторного выделения и синхронизации объектов во время асинхронного ввода-вывода с большими объемами.Шаблон проектирования Begin / End, в настоящее время реализуемый классом System.Net.Sockets.Socket, требует, чтобы объект System.IAsyncResult был выделен для каждой асинхронной операции сокета

Источник: http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

Update2

Этот вопрос не является дубликатом.Я не спрашиваю о разнице.Я хорошо знаю разницу.Если они добавили методы для сокращения выделений и работы для GC, я должен сделать то же самое на моем уровне протокола поверх обработки сокетов?то есть я должен использовать шаблон flyweight для таких объектов, как HttpReqest и т. д.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Ну, в течение одного времени жизни сокета каждая операция начала / конца будет выделять новый объект синхронизации.

Например, ваша логика такова:

// GET /default.aspx HTTP/1.1<cr-lf>
ReadLine for Http Verb and Version
// Headers
ReadLine till you get empty line and process header
// Data
Read or process mime data

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

Но все эти шаги предназначены только для одного соединения клиент / сервер.

Таким образом, ваш объект запроса / ответа будет только один в течение всего времени жизни сокета, и в этом случае вам лучше использовать новый метод Async и оставить свой объект запроса / ответа как один единственный объект.

Если сервер обрабатывает 1000 запросов одновременно, это, безусловно, повлияет на производительность.Даже если объект синхронизации занимает 100 байтов, но выделение / перераспределение, использование процессора gc повлияет на 1000 одновременных операций.

Несмотря на то, что существуют хорошо разработанные алгоритмы управления памятью, если ваш сервер будет работать непрерывно в течение длительного времени, это, безусловно, вызовет фрагментацию и замедлится.

0 голосов
/ 03 июня 2011

Не прямой ответ на ваш вопрос, но в tech ed было несколько хороших презентаций по асинхронности. Вам необходимо создать логин для их просмотра

DEV324 C # и Visual Basic Future: Async Made Simple Среда, 18 мая

DEV335 Повышение производительности приложений Microsoft ASP.NET с помощью асинхронных страниц и действий Четверг, 19 мая

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