2014-09-27 114 views
0

我們有一個使用溫莎城堡多年的大型網絡應用程序。該應用程序擁有約370個服務的組件註冊。它們幾乎全部屬於根,即入口點控制器。當網絡請求到來時,我們解析該入口控制器並讓它處理請求。問題是解決根組件需要大約35毫秒。我會說這聽起來對我來說非常重要。溫莎城堡3.2解決性能問題

我的問題是,如果上述數字聽起來很正常?任何人都可以給我提示我可以做些什麼來提高解決時間嗎?或者檢查我是否做錯了什麼?

謝謝:)

+0

你是怎麼評價這個的?在RELEASE模式下編譯並在調試器外部運行時,是否對此進行了基準測試? – Steven 2014-09-27 09:57:31

+0

是的,我使用StopWatch來測量解析日誌所需的時間並將其寫入日誌。在發佈模式和調試器之外肯定。 – Thuan 2014-09-27 10:35:50

回答

2

它需要多少時間來解決對象圖取決於很多因素,如:

  • 對象圖的大小
  • 註冊的生活方式的組件和這些生活方式的位置(顯然,如果根對象是單身人士,解析速度非常快)
  • 您在構造函數中所做的工作量

所以沒有進一步的信息,沒有太多可說的。不過,我會說35毫秒。相當多,即使是溫莎城堡。我在6個最常用的DI容器上運行了一個小型基準,同時解決了881個瞬態組件的對象圖,最慢的容器(Ninject)花費了5毫秒,而最快的容器(Simple Injector)花了0.01毫秒(在我的機器上)解決這個問題圖形。

Container  | ms. 
----------------+----- 
Simple Injector | 0.01 
StructureMap | 0.50 
Autofac   | 0.77 
Unity   | 1.04 
Castle Windsor | 3.96 
Ninject   | 5.03 

從這個基準,我會說35毫秒。對於用Castle Windsor解決這個尺寸的對象圖有點慢。因此,請確保your injection constructors are simple與檢查null並存儲傳入的依賴關係無關。這樣你可以compose your object graphs with confidence

順便說一句,你可以找到一個更廣泛的基準here

+0

謝謝:)你的回答確實給了我一些有用的提示。我將驗證我的代碼庫,稍後再回來:) – Thuan 2014-09-28 10:27:19

+0

我們的一些組件需要創建實體框架的對象上下文。我們還使用子容器爲每個請求添加更多組件,從而增加更多毫秒。所有其他構造函數對我而言並不昂貴。我的粗略估計是,所有這些繁重的操作都需要最多50%的時間。因此,看起來溫莎自己的代碼大約需要20ms,這仍然很多。 – Thuan 2014-10-13 13:31:27

+0

@ Thuan:如果這太多了,請切換到更快的容器。 – Steven 2014-10-13 13:41:16