[英]Troublesome GC.collect() calls in third-party library
在分析我的應用程序(C#,.NET 4)時,我注意到我使用的第三方庫顯式調用GC.Collect()。 這非常令人討厭,因為它有時會對我的應用程序性能產生巨大影響,因為對這個庫的一些調用最終會產生巨大的循環:在GC.Collect中花費的時間占總執行時間的80%以上。
當然,我向庫維護者報告了這種行為(lib不是開源的),但是當他們正在開發新版本時,我想優化我的應用程序。 我能做什么?
我嘗試通過將GCSettings.LatencyMode設置為GCLatencyMode.LowLatency來配置GC(當然,僅在執行庫調用期間),但無濟於事。 我寧願避免分叉我的過程。
有任何想法嗎?
您可以采取兩條道路,第一條是自己修補,第二條是通知圖書館的開發者(提交錯誤報告)。
自己修補相當容易,將RedGates Reflector與Reflexil AddIn一起使用並修補庫。 你也可以得到DotNet IL編輯器 ,它基本上做同樣的事情,但是是FLOSS。
“自己修補”方法的問題在於它有缺點:
GC.Collect()
調用,只有其中一個是合法的(我懷疑它,但可能),你將通過刪除所有這些來打破庫。 您可以做的另一件事是向庫的原始開發人員提交錯誤。 確保您不會沾沾自喜,而是提供有用的資源,例如GC上的MSDN文章和測試應用程序以及顯示問題的分析器的結果。
在嘗試破解事物以防止代碼執行GC之前,詢問它為什么會這樣做可能會有用。 雖然編寫良好的代碼應該只是在.Net認為有必要時調用GC時,編寫代碼時肯定有可能需要在特定時間運行GC以確保正確性。 我可以想象代碼可能會調用GC的三個原因:
如果由於方案3而存在強制GC,則刪除它可能會導致不良事件發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.