在分析我的应用程序(C#,.NET 4)时,我注意到我正在使用显式调用GC.Collect()的第三方库.这是非常烦人的,因为它有时会对我的应用程序性能产生巨大的影响,因为对这个库的一些调用最终会出现巨大的循环:在GC.Collect帐户中花费的时间超过总执行时间的80%.
当然,我向库维护者报告了这种行为(lib不是开源的),但是当他们正在使用新版本时,我想优化我的应用程序.我能做什么?
我试图通过将GCSettings.LatencyMode设置为GCLatencyMode.LowLatency来配置GC(当然这只是在执行库调用期间),但是无效.我宁愿避免我的过程.
有任何想法吗?
解决方法
有两条路可以采取,首先是自己修补,第二个是通知图书馆的开发者(提交错误报告).
自己修补是很容易的,得到RedGates Reflector与Reflexil AddIn和补丁库.你也可以得到DotNet IL Editor,这基本上是一样的,但是FLOSS.
“补丁自己”的方法的问题是它有缺点:
>未来版本的库也需要修补.所以你最好记录你做了什么.
>你不明白图书馆的内部,如果有10个呼叫GC.Collect(),只有其中一个是合法的(我怀疑,但可能),你会破坏库,删除所有的.
>你很可能违反图书馆的许可证,这可能会让你陷入合法的地狱.但这取决于您如何使用库,以及使用哪种软件以及最终包的分发方式.
您可以做的另一件事是向图书馆的原始开发人员提出错误.确保您没有嗅到它,而是提供有用的资源,如GC上的MSDN文章和测试应用程序以及显示问题的分析器的结果.