【问题标题】:Unknown function CoUninitializeE shows up during profiling分析期间出现未知函数 CoUninitializeE
【发布时间】:2011-09-28 20:44:18
【问题描述】:

在使用 SlimTune 分析 C# 应用程序时,我发现启用分析本机函数时,有很多条目用于名为“CoUninitializeE”的函数。 CoUninitialize 似乎与 COM 对象有关,但是我没有直接使用任何 Com 对象,而且 Google 没有关于以 E 结尾的版本的信息。

有没有人知道这个功能是什么/如何减少花在它上面的时间? (例如,它是否与内存管理有关,因此减少内存分配或释放会有所帮助?)

编辑

看来该函数的名称实际上是“CoUninitializeEx”,而 SlimTune 只是出于某种原因砍掉了一个字母。我仍然希望了解导致此函数被调用的原因。

【问题讨论】:

  • AFAIK 没有 CoUnitializeEx。可以发截图吗? CoInitialize/Ex & CoUninitialize 用于向 COM 库注册线程。我假设主线程总是在库中注册,即使您没有在主入口点提供线程属性(STAThread/MTAThread)。
  • CoUninitializeEx 似乎也在调用 CorLaunchApplication,它调用 TranslateSecurityAttribute,它调用 GetAddrOfContractShutoffFla...,它调用 SetCounterName,它调用 WaitForSingleObject,它调用 WaitForSingleObjectEx。许多这些功能似乎以 COM 为中心,但我没有(直接)使用我知道的任何 COM 对象。我使用的唯一标准库是 System.Math。

标签: c# .net profiling clr slimtune


【解决方案1】:

CoInitalizeEx() 和 CoUninitialize() 是 Windows 编程的核心。它们分别在线程上初始化和关闭 COM。 CLR 在线程运行前后自动调用这些函数。很难避免在 .NET 程序中使用 COM,它是本机 Windows 代码的基本可扩展模型。非常不可见,这要归功于 .NET 框架中隐藏管道的许多包装类。

一般诊断是您使用了很多线程。是的,很贵。线程池是一种解决方法。

【讨论】:

  • 谢谢汉斯;问题是我没有明显使用任何线程。所讨论的函数所做的唯一事情是:算术、循环/比较、内存分配(通过 new double[] 进行双精度运算)和调用 Math.Log。对 Math.Log 的调用是否会以某种方式创建一个新线程?
  • 不,它没有。不确定您在寻找什么,如果您启用对本机代码的分析,那么可以保证您会看到此功能。由于您实际上无法更改任何此代码,也许您最好不看它?
  • 具体我正在寻找与此相关的编程类型; CoUninitializeE 占用了我程序时间的 40%。它出现在某些函数中,但没有出现在其他函数中,因此它不仅仅是调用函数的持续开销。由于内存分配和 Math.Log 是我似乎正在使用的唯一“本机”调用,我想知道它是否与其中之一有关。即,如果它与 Math.Log 相关,那么我可以尝试优化我的函数以减少 Math.Log 的调用。
  • 您正在获得垃圾分析器结果。不仅仅是额外的 E. CoUninitialize 仅在线程退出时调用。再买一个,好的要花钱。
猜你喜欢
  • 2014-10-15
  • 2019-12-28
  • 2018-06-15
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多