2009-01-22 58 views
10

我最近被要求排除使用微軟複合UI應用程序塊構建的應用程序中的一些性能問題 - 特別是加載時間過長。依賴注入啓動性能

這是圍繞Microsoft的ObjectBuilder依賴注入框架構建的,它使用反射/屬性來註冊類。分析表明,在啓動時,應用程序花費了大量時間進行反射,因爲ObjectBuilder掃描每個加載的程序集中的每種類型,以搜索要註冊的內容。

替代DI框架似乎也都使用屬性,XML配置或純代碼。
似乎沒有任何其他基於屬性的框架會更好,而且我也懷疑成堆的XML必須被解析時的啓動時間等。
基於純代碼的框架看起來應該快得多,但是它們的靈活性也差得多,所以看起來好像沒有明確的好選擇......

這讓我去搜索對於DI容器基準測試,但我能找到的唯一一個是:http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html
雖然它是一個很好的基準測試,但它只測量使用容器可以快速創建1百萬個對象。我沒有興趣創建100萬個對象,我只是希望應用程序儘快啓動,所以我要找的是有關DI Container 啓動的任何信息費用,無論是博客文章,軼事,還是甚至是像「這是一種使ObjectBuilder更快」的簡單方法。

在此先感謝

回答

3

你試過測量啓動時間,當所有的組件已經NGEN'd?我發現(至少在IronScheme中),它在反射場景中有很多幫助(在我的情況下從1.5秒到0.1秒)。

+0

同意了,很多時候是由於每個班的JIT。 – 2009-01-22 03:02:58

0

在使其更快...

我想有可能是緩存啓動的結果的方式。也許應用程序花費更多的時間來完成反射,然後緩存結果,但在第二次啓動時,如果沒有任何變化,您可以從緩存中加載(可能會更快)。

至於這個緩存的性質,可能是對象被序列化到磁盤。作爲「沒有改變」的問題,創業公司可以看看支票。

0

我不瞭解ObjectBuilder,但最近的依賴注入框架通常支持延遲加載以提高啓動性能。例如,請參閱Lazing Around with Autofac2

或者你可以像在Ploeh的LazyOrderShipper示例中那樣手動完成。