2008-12-02 72 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

我會爲您的具體情況進行基準測試。

如果結果很昂貴,只需預先創建其中的一部分,然後根據需要使用,然後在後臺重新創建新部件,以確保始終有足夠多未使用的部件在等待(有點像線程池,但你每次都重新創建它們以釋放內存)。