Что означает это утверждение? - PullRequest
4 голосов
/ 01 апреля 2011

При чтении Повышения производительности и масштабируемости приложений .NET я столкнулся с этим в разделе «Повышение производительности управляемого кода / Рекомендации по сборщику мусора:

Avoid preallocating and chunking memory.

Но в книге никогда не объясняется, почему предварительное распределение является плохим или что на самом деле означает «Чанкинг» в свете оптимизации ГХ.

Может ли кто-нибудь пролить больше света на эту проблему и объяснить мне, почему эти 2 плохие и что они действительно означают с точки зрения использования GC с .net?

http://www.microsoft.com/downloads/en/details.aspx?FamilyId=8A2E454D-F30E-4E72-B531-75384A0F1C47&displaylang=en

Ответы [ 2 ]

7 голосов
/ 01 апреля 2011

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

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

У него есть несколько вещей, которые можно сказать о проблемах.Страница 198:

Программисты C ++ часто выделяют большой блок памяти (используя malloc), а затем используют порции для сохранения нескольких вызовов в malloc.Это не рекомендуется для управляемого кода по нескольким причинам:

  • Распределение управляемой памяти является быстрой операцией, а сборщик мусора оптимизирован для чрезвычайно быстрого выделения.Основной причиной предварительного выделения памяти в неуправляемом коде является ускорение процесса выделения.Это не проблема для управляемого кода.
  • Если вы предварительно выделяете память, вы вызываете больше выделений, чем необходимо;это может вызвать ненужные сборки мусора.
  • Сборщик мусора не может восстановить память, которую вы перезапускаете вручную.
  • Предварительно выделенная память стареет и стоит больше, чтобы утилизировать ее после окончательного освобождения.
...