麻烦的GC.collect()调用第三方库

Dom*_*Eav 10 .net c# performance profiling garbage-collection

在分析我的应用程序(C#,.NET 4)时,我注意到我使用的第三方库显式调用GC.Collect().这非常令人讨厌,因为它有时会对我的应用程序性能产生巨大影响,因为对这个库的一些调用最终会产生巨大的循环:在GC.Collect中花费的时间占总执行时间的80%以上.

当然,我向库维护者报告了这种行为(lib不是开源的),但是当他们正在开发新版本时,我想优化我的应用程序.我能做什么?

我尝试通过将GCSettings.LatencyMode设置为GCLatencyMode.LowLatency来配置GC(当然,仅在执行库调用期间),但无济于事.我宁愿避免分叉我的过程.

有任何想法吗?

Bob*_*bby 7

您可以采取两条道路,第一条是自己修补,第二条是通知图书馆的开发者(提交错误报告).

自己修补相当容易,将RedGates ReflectorReflexil AddIn一起使用并修补库.你也可以得到DotNet IL编辑器,它基本上做同样的事情,但是是FLOSS.

"自己修补"方法的问题在于它有缺点:

  • 未来版本的库也需要修补.所以你最好记录下你做了什么.
  • 您不了解库的内部,如果有10个调用,GC.Collect()并且只有其中一个是合法的(我怀疑它,但可能是),您将通过删除所有这些来破坏库.
  • 您很可能会违反图书馆的许可证,这可能会让您陷入法律地狱.但这取决于您如何使用库以及使用什么软件以及最终包的分发方式.

您可以做的另一件事是向库的原始开发人员提交错误.确保您不会沾沾自喜,而是提供有用的资源,例如GC上的MSDN文章和测试应用程序以及显示问题的分析器的结果.