Личная куча или управление памятью самостоятельно - PullRequest
3 голосов
/ 05 мая 2010

Я знаю, что мы могли бы получить некоторые преимущества от создания частной кучи Windows, особенно для часто выделяемых и выделяемых небольших кусков. Но я думаю, что нормальный подход состоит в том, чтобы выделить большую память из кучи по умолчанию и самостоятельно управлять распределением и удалением. Мой вопрос: каковы преимущества и недостатки этих двух способов?

Спасибо, Макс

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Некоторые преимущества управления собственной кучей:

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

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

Некоторые преимущества использования системных распределений (например, HeapAlloc):

  • Меньше сложности.
  • Снижен риск возникновения проблем параллелизма при выделении / освобождении.
  • Способность использовать Куча низкой фрагментации . Это уже делает очень хорошую работу в большинстве случаев очень эффективной обработки небольших выделений.
2 голосов
/ 05 мая 2010

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

Во многих случаях фрагментация - ваш злейший враг. При распределении сохраняйте размеры объектов постоянными или имеющими размеры (степень двойки популярна, но может быть слишком расточительной). Это уменьшает фрагментацию, поскольку выделяется только несколько общих размеров памяти.

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