5

我試圖解決一些啓動時間問題。在做一些分析後,我發現主要的罪魁禍首是ClassProxyGenerator.GenerateCode。第一次每種類型需要400-600毫秒。因此,如果應用程序的入口點有8個依賴項(在一個鏈中)需要代理生成,那麼應用程序的啓動時間將增加4.8秒。這可能看起來不是很多,但對於用戶來說,它看起來像年齡。DynamicProxy生成速度

任何建議,以改善這一點?

更新:

我可以重現的時間與以下控制檯應用程序:

 var container = new WindsorContainer(); 
     container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing 
     container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>()); 
     var t = DateTime.Now; 
     var instance = container.Resolve<IMyRepository>(); 
     Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds); 

輸出某處550ms和750毫秒之間。

IMyRepository是30個實體類型(由T4模板生成)的存儲庫接口。它有31個IQueryables,31個保存重載和31個刪除重載。 MyAbstractRepository是一個部分抽象類。它聲明瞭相同的3 x 31個方法。

如果我刪除所有保存和刪除的方法和只留下31個IQueryables,不註冊的抽象庫

container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>()); 

我仍然奔波250ms的初始產生。

這是一個非常非常快的機器......所以現實世界中的任何事情都可能比上面列出的數字慢。

+1

這是荒謬的 - 除非你的類型有成百上千的方法(或者你在20機器上運行代碼),否則不應該如此。你可以創建孤立的複製? –

+0

我知道......並且它不是20年前的機器......它似乎是具有這種滯留(其他類型在5-10ms內產生)的特定類型的集合...我將隔離並提供代碼示例。 – Jeff

+1

如果您的依賴項可以延遲使用,您可能可以隱藏虛擬代理後面的依賴關係圖部分。看到這裏的概念概述:http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

回答

1

您可能可以在不同的線程中執行代理初始化,以便在生成代理時應用程序本身可以繼續初始化。考慮將它排入線程池。

另一種選擇可能是將代理編譯爲持久化的程序集文件,然後將其保存到磁盤。這樣做會顯着降低首次運行後的啓動時間。

我不知道爲什麼Castle的動態代理需要這麼長時間才能初始化。我不使用它們,我通常直接發送代碼(或者作爲簡單方法的LCG,並且通過完整的Reflection.Emit來完成實現)。即使產生數百種LCG方法,我也從未有過如此長時間的延遲。也許使用不同的方法/庫(LinFu等)也可以解決這個問題。