Вопрос

Продолжая обсуждение от Понимание VS2010 C # Результаты параллельного профилирования Но больше до такой степени:

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

Это создает разум на мировой резьбе аллекатора памяти.

Есть ли способ проинструктировать .NET Presallocate пула памяти для каждого потока и выполнять все распределения из этого пула?

В настоящее время мое решение является моей собственной реализацией пулов памяти (глобально выделенные массивы объекта типа T, которые перерабатываются среди потоков), которые много помогают, но не эффективны, потому что:

  1. Я не могу проинструктировать .NET выделять из определенного ломтика памяти.
  2. Мне все еще нужно позвонить новый много раз выделить память для бассейнов.

Спасибо,
Haggai.

Это было полезно?

Решение

Я искал два дня, пытаясь найти ответ на тот же вопрос, который вы имели. Ответ - это вам нужно установить режим сборки мусора в режим сервера. По умолчанию режим сборки мусора установлен в режим рабочей станции. Настройка сборки мусора в режим сервера заставляет управляемую кучу разделить в отдельно управляемых разделах, один-на CPU. Для этого вам нужно добавить настройку конфигурации в файл App.config.

<runtime>
   <gcServer enabled="true"/>
</runtime>

Разница скорости на моем 12-ядроном Opteron 6172 была драматичной!

Другие советы

Сборщик мусора не выделяет память.

Звучит больше похоже на то, что вы выделяете много небольших временных объектов и несколько долгоживущих объектов, а сборщик мусора проводит много времени сбора мусора временных объектов, чтобы ваше приложение не должно запросить больше памяти от ОПЕРАЦИОННЫЕ СИСТЕМЫ. От .NET Framework 4 Расширенное развитие - сборка мусора:

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

Решение: Не выделяйте много небольших временных объектов. Страница включена Коллекция и производительность мусора Также может быть полезно.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top