2010-02-27 3 views
0

Чтение через SendAsync, BeginAsync метод иллюстрации Socket с, я понял, что это было предложено объединить SocketAsyncEventArgs примеры говорят, что это лучше, чем BeginXX, EndXX подход, так как асинхронные каждый вызов создает экземпляр IAsyncResult..NET Pooling IAsyncResult объектов

Я думал, что это не была отличная практика для объединения объектов, которые могут быть легко созданы (например, SocketAsyncEventArgs). Размещение объектов довольно быстро, и GC оптимизирован для эффективного управления короткими живыми объектами. Я попробовал это реализовать механизм объединения, чтобы увидеть, как он выполняется, на самом деле распределение выполняется быстрее на простых объектах, которые ничего не делают, кроме инкапсуляции некоторых данных в ctor. (Ну, это было похоже на профилирование СУБД, отправив миллиарды SELECT 1 заявлений, вот почему я здесь.)

Я не спрашиваю, что лучше, я считаю, что профилирование фактического приложения даст ответ, но просто любопытно о преимуществах объединения простых коротких живых объектов. Лучшая производительность GC? Низкая фрагментация памяти? Стоит ли учитывать это во время проектирования?

От MSDN

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

В новых усовершенствованиях класса System.Net.Sockets.Socket асинхронные операции сокетов описываются многоразового SocketAsyncEventArgs объектов выделены и поддерживаются приложения. Высокопроизводительный сокет приложений лучше всего подходит для операций с перекрывающимися гнездами , которые должны быть поддерживаются . Приложение может создать столько объектов SocketAsyncEventArgs, которые ему нужны . Например, если сервер приложения должны иметь 15 сокета принимать операции выдающихся во всех раз, чтобы поддерживать входящие скорости соединения клиента , он может выделить 15 многоразовых SocketAsyncEventArgs Объектов для этой цели.

Спасибо.

+0

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

+0

@dr. зло Добавил ссылку. Это около 100 клиентов, отправляющих 3-5 небольших пакетов в секунду. Я также создаю объекты «Message» для каждого пакета, поэтому мне было интересно, следует ли их объединять. –

+1

Я думаю, что вы будете более чем на 100 клиентов 3-5 пакетов в секунду. Я не думаю, что вам нужно также объединить сообщение (просто убедитесь, что оно правильно настроено). Управление памятью .NET может обрабатывать гораздо больше, чем легко, без влияния производительности. –

ответ

2

Интерфейс IAsyncResult включает в себя имущество AsyncWaitHandle типа WaitHandle. A WaitHandle потребляет ресурсы операционной системы.

Фактически, WaitHandle реализует интерфейс IDisposable, поэтому класс, реализующий IAsyncResult, должен сам реализовать IDisposable.

Это все, чтобы сказать, что сотни IAsyncResult экземпляров, лежащих вокруг не памяти проблемы - это ресурсов вопрос. Новые вызовы сокетов избавляются от необходимости использования сотен объектов IDisposable.

1

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