Что потримить если на небольших вычислениях GC занимает много времени?

Всем привет,

Есть система вычислений на TPL (Task) с сильным "ветвлением".
Все написано по "фен шую" с async и тд и мы в общем-то довольны.

Мы читаем парочку гигов с диска и по сети, исходя из данных (если данные вообще есть) и даем их дальше.

Имеем:
1. Много Task.ContinueWith.
2. Много временных объектов которые выбрасываются на след. шаге.
3. Почти нулевой gen3/LOH.
4. 3000+ тасков в сумме.

Все работает хорошо пока есть чем заняться.
Но, если делать "нечего", то мы получаем много мелких тасков и упираемся в 30-40% GC.

На данный момент есть идея включить server GC или играться с Latency Modes.

Резерв по памяти есть, но отключать GC полностью нельзя.

Может у кого есть другие идеи?
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ответы на вопрос 2
Думаю стоить просто включить профайлер и посмотреть что кушает память. И что вы понимаете под "нечего" делать?
Ответ написан
GavriKos
@GavriKos
Классика жанра - пул объектов и их реюз. Не аллоцируйте каждый раз объекты под временные результаты, а используйте уже существующие, но ненужные.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы