我的程序集被加载到多个应用程序域中。 Jit-ting我的装配是否按程序执行了一次?或者每appdomain一次?
或者它是完全复杂的东西?
答案 0 :(得分:3)
这很复杂。这个msdn article说
如果程序集作为域中性加载,则表示其代码可以在另一个AppDomain中重用。如果程序集作为域绑定加载到多个AppDomain中(这是默认值),则每个AppDomain都会获得自己的代码副本。这有几个糟糕的性能特征。首先是CPU成本。如果程序集有本机映像,则只有第一个AppDomain可以使用本机映像。所有其他AppDomain都必须JIT编译代码,这可能导致显着的CPU成本。
接下来,JIT编译的代码驻留在私有内存中,因此无法与其他进程或AppDomain共享。如果程序集确实有NGEN映像,则第一个AppDomain使用该映像。所有其他AppDomain都必须JIT编译代码,这意味着还加载了该程序集的MSIL DLL。从冷启动的角度来看,这是最糟糕的情况,因为该程序集的磁盘访问量会翻倍。
将程序集作为域中性加载可确保本机映像(如果存在)在应用程序中创建的所有AppDomain中使用。如果不存在本机映像,则将程序集加载为域中性仍然有好处,因为代码只编译一次,然后由应用程序中的所有AppDomain共享。