.net 通过COM的Assembly.GetTypes在System.Data.Entity上花费很长时间
我发现一个方法存在性能问题,该方法定位从某个类型派生的类型。它使用反射获取当前加载的所有程序集(.net 通过COM的Assembly.GetTypes在System.Data.Entity上花费很长时间,.net,performance,entity-framework,reflection,com,.net,Performance,Entity Framework,Reflection,Com,我发现一个方法存在性能问题,该方法定位从某个类型派生的类型。它使用反射获取当前加载的所有程序集(AppDomain.CurrentDomain.GetAssemblys()),然后迭代每个程序集中的所有类型(assembly.GetTypes())以查找匹配项。它在一个单独的DLL中实现,可以在.NET应用程序中使用,但它也是COM可见的,可以从VB6应用程序中调用 这种方法非常有效,在许多情况下也表现良好。我的问题是,在某些情况下,对assembly System.Data.Entity的Ge
AppDomain.CurrentDomain.GetAssemblys()
),然后迭代每个程序集中的所有类型(assembly.GetTypes()
)以查找匹配项。它在一个单独的DLL中实现,可以在.NET应用程序中使用,但它也是COM可见的,可以从VB6应用程序中调用
这种方法非常有效,在许多情况下也表现良好。我的问题是,在某些情况下,对assembly System.Data.Entity的GetTypes调用需要很长时间,超过5秒。以下是主要观察结果:
- GetTypes调用总是花费很长时间的System.Data.Entity,而不是另一个程序集。在50个其他加载的程序集上可能会有GetTypes调用,但所有这些调用都会立即完成
- 如果从.NET应用程序(例如.NET控制台应用程序)中调用该方法,则不会出现此性能问题。GetTypes调用总是在瞬间完成
- 如果该方法是从通过COM使用my DLL的VB6应用程序中调用的,则问题经常发生,但并非总是如此。我还不知道,是什么原因导致5秒以上的时间延迟有时发生,有时不发生
彼得。这听起来不像是一个.NET冷启动问题。是的,加载CLR、查找磁盘上的所有程序集、及时编译所有代码需要一段时间。@Hans,谢谢您的回复!我看到调试器在执行.NET代码时出现延迟,因此这与加载CLR无关。另外,由于
AppDomain.CurrentDomain.getAssemblys()
迭代所有加载的(!)程序集(至少是这样说的),因此它似乎也不涉及加载任何DLL。最后,我不知道应该为另一个调用Assembly.GetTypes
对另一个程序集进行JIT编译的代码。根据您提供的信息,这是无法诊断的。您需要收集更多数据,请使用托管探查器。