2009-09-13 28 views
4

依賴注入是否可能導致大的開銷?使用依賴注入的開銷

我會這麼想,特別是如果解析器被調用很多次(這很可能看圖案示例)?或者我想錯了?不幸的是,我無法測試自己,因爲我從來沒有使用它,但計劃使用它。

+1

您可能需要重新狀態的問題,如使用「難道一個IoC容器可能會導致大量開銷「。很多人將DI作爲一般概念(即在運行時而不是編譯時指定依賴關係)和IoC容器作爲一種特定的DI策略進行區分。 – 2009-09-13 05:51:17

回答

4

除非您使用的是service locator,否則我懷疑這些開銷會產生重大差異。 (即使你是,它也不可能是重要的。)

使用構造函數注入和一個現代框架,解析器將在構造對象時被調用。大多數情況下,我懷疑你會發現具有依賴關係的對象是相對較高級別的組件,或者兩者兼而有之。

如果您使用的是IoC容器,並在緊密循環中創建對象的很多具有依賴性,你可能需要做一些優化。你總是可以描述或基準測試。

總之,我不會擔心它。

3

作爲一個概念的依賴注入不需要很高的開銷:它只是簡單地構造一個類,以便它可以在運行時構建到其他類的連接,而不是在代碼中進行硬連線。

當然,有很多方法可以構建運行時連接,這可能會帶來很高的開銷。避免這些方法。

1

依賴注入本身只是一個簡單的間接尋址,所以有開銷,但它確實很小。運行時模式匹配和解析是另一回事(但通常與依賴注入一起使用,它不像DI 要求這樣的額外;-)。

1

依賴注入不會帶來巨大的開銷。我相信你會在其他地方發現瓶頸。如果您擔心的是開銷過多,可能是C#不是您想要使用的語言。您使用C#來獲得它帶來的好處,它會提取一些您不想處理的細節。

與DI相同,它還具有使應用程序鬆散耦合等優點,這意味着它將在未來更容易維護。

1

http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html進行一些性能測試。每個測試運行1000000個創作。

請注意,基準測試顯示單例分辨率和瞬態分辨率:單例是在那裏您註冊了一個類的實例,例如(使用Unity):

container.RegisterInstance<IMyType>(new ConcreteMyType()); 

並且每次都返回此實例(這很快)。

瞬態是您只註冊類類型的地方,IoC框架將爲您完成creatnig的工作,例如, (在Unity中)

container.RegisterType<IMyType, ConcreteMyType>(); 

這需要更多的時間來返回一個單例。

就整體優化而言,依賴注入的開銷是小啤酒;其他性能瓶頸更可能是優化的事情。

0

架空VS testeable和維護的代碼...我選擇testeable和維護的代碼(你總是可以買一個更快的計算機)

=)