2015-07-08 2 views
3

Мне нужно приложение, которое будет работать гладко. У меня много последовательных серий вычислений, которые мне нужно выполнять в короткие промежутки времени каждый раз, поэтому я не против, чтобы GC выполнял эту работу, и я даже могу принимать более частые коллекции, но мне нужно минимизировать длину каждой коллекции GC ,Как свести к минимуму длину коллекций GC?

Хотелось бы (если возможно) иметь 1 миллимум максимальной активности потока из-за GC каждый раз.

Каков наилучший способ добиться этого в .NET (я знаю, что .NET это не технология для таких требований, но если она будет соответствовать моим требованиям, когда оптимизируется экономия времени разработки и гибкость для будущих спецификаций, это хороший стимул попробовать его)?

+3

Не используйте .NET. Это не означает, что этот тонкий контроль над временем, даже другие функции ОС могут прерывать и занимать больше времени. Вы пытаетесь сделать какой-то контроль в реальном времени или что-то в этом роде? –

+0

@RonBeyer вы в этом уверены? Я понимаю, например, что существуют различия в работе GC между серверными и настольными версиями окон, хотя они оба запускают одно и то же окно ядра ... (https://nabacg.wordpress.com/2013/05/13/gc- background-vs-concurrent-mode /) – Joezer

+0

Да, я в этом уверен. Нет никакой разницы между версиями Windows для серверов и настольных систем для GC, но есть установка GC на сервер/рабочий стол. Разница заключается в количестве потоков, посвященных GC, и что потоки сервера не могут быть отключены. См. Https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx#background_garbage_collection –

ответ

0

справа от страницы MSDN: https://msdn.microsoft.com/en-us/library/ms973837.aspx

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

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

  • Минимизировать количество указателей на объекты, которые записываются, особенно записи, сделанные для старых объектов.

  • Уменьшите плотность указателей в структурах данных.

  • Ограничивайте использование финализаторов, а затем только на «листовых» объектах, насколько это возможно. Если это необходимо, обменивайте объекты, чтобы помочь в этом.

  • Регулярная практика рассмотрения ваших ключевых структур данных и ведение профилей использования памяти с помощью инструментов, таких как Allocation Profiler будет пройти долгий путь, чтобы держать использование памяти эффективным и с сборщик мусора работает его лучше для вас.

Как Рон отметил в своем комментарии. Вы должны быть более умными с .NET, если вы хотите много контролировать GC.

+0

Когда вы запустите GC, он будет работать до тех пор, пока это не будет выполнено. Единственный способ получить лучшую производительность из GC - написать код, который максимизирует эффективность с тем, как GC работает под ним. Вы можете вручную запустить операцию Collect() самостоятельно и указать количество собираемых объектов. https://msdn.microsoft.com/en-us/library/system.gc(v=vs.110).aspx – matrixugly

Смежные вопросы