2008-12-02 60 views
1

我刚刚发现,如果通过Reflection.Emit生成组件,.NET框架会将引用保留在静态成员中,以防止Reflection.Emit类不被GC化。AppDomain创建速度有多快?

由于局限性,我无法使用DynamicMethod。我还在程序过程中生成了很多程序集(IronScheme的增量编译器)(可能是1000+)。

因此,我正在考虑在一个单独的域中处理代码生成,并在稍后卸载它(尚未决定如何处理此问题)。

有没有人有任何经验这将是多么昂贵?

回答

1

据我所知,它比产卵线稍慢。


一直在做一些研究,试图找到一个真正的参考。到目前为止,这是我能拿出最好的:
http://msdn.microsoft.com/en-us/library/aa159887.aspx

下来的方式,调用中创建应用程序域“昂贵”的约2/3,不过你可能会说,大约在某些contexts-线程同它真的取决于特定线程在创建时的功能。

还是那句话:这是我的理解是一个AppDomain本质上是一个过程—逻辑分隔符中的一个线程(或多个线程),如果你将—使得运行时保证一定的额外保护是有效防止单独的AppDomain从互相干扰。要在现有流程(应用程序)中创建一个新的AppDomain,框架必须完成与创建新线程相关的所有工作,以及在应用程序的其余部分中设置一些额外开销(这可能还涉及加载一个或多个组件到内存中)。最终,AppDomain居住在线程和进程之间的某处。

+0

这真是个好消息!我刚刚发现了更多的参考文献,它确实搞乱了GC :) – leppie 2008-12-02 18:25:01

2

我会为您的具体情况进行基准测试。

如果结果很昂贵,只需预先创建其中的一部分,然后根据需要使用,然后在后台重新创建新部件,以确保始终有足够多未使用的部件在等待(有点像线程池,但你每次都重新创建它们以释放内存)。