NGen和通用集合。如何摆脱Jitting?

时间:2013-05-20 10:31:46

标签: .net winforms optimization clr ngen

我正在努力研究ngen和泛型集合。我已经在解决方案中使用了所有程序集,但是每当我的应用程序执行该代码时,仍会以某种方式进行jitting:

private Dictionary<int, bool> VerifyedFunc; 

public SecurityProvider()
{
    ...
    VerifyedFunc = new Dictionary<int, bool>();
    ...       
}

MDA消息:

Managed Debugging Assistant 'JitCompilationStart' has detected a problem in '*.exe'.
Additional Information: 
<mda:msg xmlns:mda="http://schemas.microsoft.com/CLR/2004/10/mda">
<mda:jitCompilationStartMsg break="true">
<method name="mscorlib!System.Collections.Generic.Dictionary`2::.ctor"/>
</mda:jitCompilationStartMsg>
</mda:msg>

NGen和泛型集合是否存在一些问题?

1 个答案:

答案 0 :(得分:9)

嗯,这不是问题。您使用jitCompilationStartMsg调试助手使问题成为问题。这只是报告抖动开始了。我们在您之前关于该MDA的问题中对此进行了讨论。

这是完全正常的,以及泛型在.NET中的工作方式。抖动在运行时从通用cookie-cutter类定义生成具体类。 任何引用类型将具有一个具体类的实例,并且对于您在代码中使用的每个值类型都有一个实例。

这当然与Ngen不太相容,Dictionary&lt;&gt;是mscorlib.dll中的一个类,当您在计算机上安装.NET时,该程序集已被编译。 Ngen无法预测您将在代码中实例化的具体类类型。在mscorlib.dll中有一个对策,它预先定义了许多泛型类型,因此它们将被添加。与List<int>一样,很可能在应用程序中使用。在.NET框架本身。

您可以在Reference Source, CommonlyUsedGenericInstantiations() method中看到这些预先声明的泛型类型。请注意它是如何有几个预煮的版本的Dictionary&lt;&gt;在那种方法中。但一个Dictionary<int, bool>,太不寻常了。因此需要为您创建类型的抖动。