分析期间出现未知函数 CoUninitializeE

Posted

技术标签:

【中文标题】分析期间出现未知函数 CoUninitializeE【英文标题】:Unknown function CoUninitializeE shows up during profiling 【发布时间】: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。 【参考方案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 仅在线程退出时调用。再买一个,好的要花钱。

以上是关于分析期间出现未知函数 CoUninitializeE的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CoUninitialize 在退出时会导致错误?

OTL TOmniBlockingCollection(COM 多线程)中的 CoInitialize/CoUninitialize 错误处理

VC6的MFC如何调用C#的tlb文件

OpenCV2.4 错误:未知函数文件中不支持 GPU

迁移期间 Laravel 未知数据库错误

在 Rails 上导入 CSV 期间的未知属性“headers ...”