2011-09-28 28 views
2

雖然使用SlimTune來剖析C#應用程序,但我發現在啓用剖析本機函數時,有一個名爲「CoUninitializeE」的函數有很多條目。 CoUninitialize似乎與COM對象有關,但是我不直接使用任何Com對象,並且Google沒有關於以E結尾的版本的信息。未知函數CoUninitializeE在分析過程中顯示

有沒有人知道此功能是什麼/如何減少在它上花費的時間? (例如,是它涉及到內存管理,這樣減少了內存分配或取消分配將幫助?)

編輯

它出現在函數的名稱實際上是「CoUninitializeEx」和SlimTune只是斬去出於某種原因的信。我仍然很欣賞導致這個函數被調用的知識。

+0

AFAIK沒有CoUnitializeEx。你可以張貼截圖嗎? CoInitialize/Ex&CoUninitialize存在以向COM庫註冊線程。我假設主線程始終在庫中註冊,即使您沒有在主入口點上提供線程屬性(STAThread/MTAThread)。 –

+0

CoUninitializeEx似乎也在調用CorLaunchApplication,它調用TranslateSecurityAttribute,它調用GetAddrOfContractShutoffFla ...,它調用SetCounterName,它調用WaitForSingleObject,它調用WaitForSingleObjectEx。很多這些函數看起來都是以COM爲中心的,但我並不直接使用任何我知道的COM對象。我正在使用的唯一標準庫是System.Math。 –

回答

3

CoInitalizeEx()和CoUninitialize()是Windows編程的核心。它們分別在一個線程上初始化和關閉COM。 CLR在線程運行之前和之後自動調用這些函數。在.NET程序中避免使用COM是相當困難的,它是本地Windows代碼的基本可擴展性模型。完全不可見,感謝.NET框架中的許多包裝類,它隱藏了管道。

通用診斷是你使用了很多線程。是的,很貴。線程池是一種解決方法。

+0

感謝Hans;問題是我沒有明顯使用任何線程。有問題的函數做的唯一事情是:算術,循環/比較,內存分配(double通過new double []),並調用Math.Log。對Math.Log的調用是否會創建一個新的線程? –

+0

不,它不。不確定你在找什麼,它啓用了本地代碼的分析,然後保證你會看到這個功能。既然你實際上不能改變這些代碼,也許你最好只是不看它? –

+0

具體而言,我正在尋找與此相關的編程類型; CoUninitializeE佔我節目時間的40%。它出現在一些函數中,但不出現在其他函數中,所以它不僅僅是調用函數的常量開銷。由於內存分配和Math.Log是我似乎正在使用的唯一「本地」調用,所以我想知道它是否與其中之一有關。 I.E.,如果它與Math.Log有關,那麼我可以試着優化我的函數來調用Math.Log。 –