.net Быстрое выделение памяти - PullRequest
0 голосов
/ 13 апреля 2011

В моем приложении есть несколько случаев, когда относительно небольшие объекты (максимум 50 байт), например, классы сообщений для целей регистрации, должны часто создаваться и освобождаться (GC) во время выполнения программы.Поэтому меня беспокоит накладные расходы на динамическое размещение этих объектов.Как указано в этом вопросе , для собственного кода есть несколько доступных быстрых распределителей памяти.
Существует ли концепция быстрого выделения памяти в .Net или требуется быстрое выделение памяти в .Net?Если нет, то что можно использовать для ускорения такого рода реализации?(Может быть, какой-то заранее выделенный пул объектов.) Стоит ли беспокоиться о накладных расходах?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

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

Я полагаю, что вы могли бы иметь возможность реализовать распределитель, используя unsafe код, но стоило ли это того, чтобы потянуть за волосы?Вы должны зарегистрироваться, чтобы знать.

2 голосов
/ 13 апреля 2011

Как и следует хорошо спроектированному распределителю памяти, существует только один способ выделения памяти, собираемой мусором.Это очень быстро, выделение просто требует настройки указателя.Гораздо быстрее, чем распределитель, который должен использовать нативный код.Который имеет гораздо более сложную работу, после того, как выделенная собственная память больше не может быть перемещена.Что затрудняет написание распределителя, который не страдает от фрагментации.Контрмеры добавляют накладные расходы.Не проблема в куче ГХ, она может сжаться.

Вы не можете улучшить скорость распределителя ГХ.

1 голос
/ 13 апреля 2011

Если бы объекты были маленькими и недолговечными, я бы не сильно волновался.Скорее всего, их собирают с помощью Gen0 GC, который обычно относительно дешев.

Вы можете реализовать пул, но по моему опыту это необходимо, только если вы выделяете большие объекты (если я правильно помню, объекты размещаются накуча больших объектов, если их размер превышает 80 КБ) или очень много (много миллионов в секунду) объектов.

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

...