Пользовательские распределители памяти или пулы памяти - PullRequest
3 голосов
/ 30 января 2012

Я использую стороннюю сетевую библиотеку, и для отправки сетевого сообщения мне нужно создать новый экземпляр класса NetworkMessage.Это неэффективно, потому что приложение должно работать очень быстро и отправлять много сообщений, поэтому я ищу способ избежать динамического выделения памяти для каждого сообщения.

Если NetworkMessage былструктура тогда у нас не было бы проблемы.Также я не могу сохранить несколько предварительно созданных NetworkMessage экземпляров, потому что аргументы сообщения могут быть переданы только в конструкторе, и они не могут быть изменены позже.Я не могу ничего изменить в классе NetworkMessage, так как он является сторонним.

Есть ли способ создать пул памяти в C #, а затем использовать нечто подобное оператору размещения new из C ++ для создания объектов из этогобассейн?(Я знаю, что нет нового оператора размещения в C #).Я ищу способ инициализации блока памяти, а затем использовать куски этой памяти для создания экземпляров класса NetworkMessage из этого.

Ответы [ 2 ]

1 голос
/ 30 января 2012

Что NetworkMessage принимает в качестве входных параметров в конструкторе?

Требуется ли байтовый массив?Если это так, это будет лучшим кандидатом на объединение в пул, а не на сам класс NetworkMessage.

У Microsoft есть Образец сетевого подключения , который иллюстрирует, как пул большого байтового массива может работать на образце сервера Async Socket

1 голос
/ 30 января 2012

Прежде чем мы продолжим, одно замечание: распределение памяти в .NET суперэффективно. Это не дорогая операция, как это было в COM.

При этом я вижу два решения:

Одна вещь, которую вы можете сделать, это просто создать пул экземпляров NetworkMessage самостоятельно. Затем вы можете взять их и освободить их из пула, используя простой класс менеджера.

Другой вариант - использовать инверсию контейнера управления , например Castle Windsor , Unity или NInject . Такие контейнеры обрабатывают создание зависимостей и управление временем жизни объектов.

Удачи!

...