.net AppDomain的创建速度有多快?

.net AppDomain的创建速度有多快?,.net,appdomain,reflection.emit,.net,Appdomain,Reflection.emit,我刚刚发现,如果通过Reflection.Emit生成程序集,.NET框架将引用保留在静态成员中,以防止Reflection.Emit类不被GC’ed 由于限制,我无法使用DynamicMethod。在一个程序过程中(可能是1000+),我还生成了很多程序集(IronScheme的增量编译器) 因此,我想在一个单独的域中处理代码生成,然后卸载它(还没有决定如何处理) 有人知道这会有多贵吗?据我所知,这比生成线程要慢一点 一直在做一些研究,试图找到一个真正的参考。到目前为止,这是我能想出的最好办

我刚刚发现,如果通过Reflection.Emit生成程序集,.NET框架将引用保留在静态成员中,以防止Reflection.Emit类不被GC’ed

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

因此,我想在一个单独的域中处理代码生成,然后卸载它(还没有决定如何处理)


有人知道这会有多贵吗?

据我所知,这比生成线程要慢一点


一直在做一些研究,试图找到一个真正的参考。到目前为止,这是我能想出的最好办法:

大约2/3的情况下,它称创建AppDomains是“昂贵的”,但在某些上下文中,您可能会对线程说同样的话——这实际上取决于特定线程在创建时做了什么


再次强调:我的理解是,AppDomain本质上是一个进程中的一个线程(或多个线程)——如果您愿意的话,它是一个逻辑分隔符——这样运行时就可以保证某些额外的保护生效,以防止单独的AppDomain相互干扰。要在现有进程(应用程序)中创建新的AppDomain,框架必须完成与创建新线程相关的所有工作,外加一些额外的开销,以便在应用程序的其余部分中进行设置(这可能还涉及将一个或多个程序集加载到内存中)。最后,AppDomain位于线程和进程之间。

我将根据您的具体情况对其进行基准测试


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

这确实是个好消息!我刚刚从中发现了更多的引用,它确实弄乱了GC:)现在来弄清楚如何顺利地处理它,grrr!