Проблемные вызовы GC.collect () в сторонней библиотеке - PullRequest
10 голосов
/ 14 марта 2011

Во время профилирования моего приложения (C #, .NET 4) я заметил стороннюю библиотеку, которую я использую явным образом, вызывает GC.Collect ().Это очень раздражает, потому что иногда это сильно влияет на производительность моего приложения, так как некоторые вызовы этой библиотеки заканчиваются огромными циклами: время, проведенное в GC.Collect, составляет более 80% от общего времени выполнения.

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

Я попытался настроить GC, установив для GCSettings.LatencyMode значение GCLatencyMode.LowLatency (конечно, только во время выполнения вызовов библиотеки), но безрезультатно.Я бы предпочел избежать разветвления моего процесса.

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 14 марта 2011

Вы можете выбрать одну из двух дорог: первая - это исправление самостоятельно, вторая - информирование разработчика библиотеки (подача отчета об ошибке).

Самостоятельная установка исправления довольно проста, получите RedGates Reflector вместе с Reflexil AddIn и исправление библиотеки.Вы также можете получить DotNet IL Editor , который в основном делает то же самое, но является FLOSS.

Проблема с подходом "исправь сам" заключается в том, что у него есть недостатки:

  • Будущие версии библиотек также должны быть исправлены.Поэтому вам лучше вести записи о том, что вы сделали.
  • Вы не понимаете внутреннюю часть библиотеки, если есть 10 обращений к GC.Collect(), и только один из них является законным (я сомневаюсь в этом, но мог бы быть), вы сломаете библиотеку, удалив их все.
  • Скорее всего, вы нарушите лицензию библиотеки, что может привести вас в законный ад.Но это зависит от того, как вы используете библиотеку и в каком программном обеспечении и как этот окончательный пакет распространяется.

Еще одна вещь, которую вы можете сделать, это сообщить об ошибке первоначальным разработчикам библиотеки.Убедитесь, что вы не очень довольны этим, и вместо этого предоставьте полезные ресурсы, такие как статья MSDN о ГХ и тестовое приложение вместе с результатами профилировщика, который показывает проблему.

3 голосов
/ 17 марта 2011

Прежде чем пытаться взломать что-то, чтобы код не выполнял GC, может быть полезно спросить, почему это происходит. В то время как хорошо написанный код должен просто вызывать GC, когда .Net считает это необходимым, безусловно, можно написать код, который требует, чтобы GC запускался в определенное время для обеспечения корректности. Я могу представить три причины, по которым код может вызывать GC: * ​​1001 *

  1. Вызовы GC были добавлены в целях профилирования памяти и случайно / ненадлежащим образом покинули его.
  2. Разработчик посчитал, что это хорошая идея, хотя она не приносит никакой реальной выгоды.
  3. Некоторый тип управляемого ресурса был неправильно заброшен; принуждение к GC может позволить достаточно своевременно очистить такой заброшенный ресурс, чтобы обеспечить правильное (хотя и медленное) выполнение программы.

Если принудительный сборщик мусора существует по сценарию 3, его удаление может привести к плохим последствиям.

...