2008-10-22 23 views
64

可能重複:
How costly is .NET reflection?什麼是.NET反射的「成本」?

目前我在編程的心態,反思是我最好的朋友。我用它來動態加載內容,允許「鬆散實現」而不是嚴格的接口,以及許多自定義屬性。

使用反射的「真實」成本是多少?

對於頻繁反映的類型來說,是否值得讓緩存反射,比如我們自己的所有屬性中的LINQ DAL目標代碼到表定義?

高速緩存的內存佔用會超出反射CPU使用率嗎?

+20

我在世界上是如何得到一個3個月大的回答的話題的投票? – 2009-01-16 20:33:01

+0

我們使用泛型基類和反射來自動化我們的數據訪問層。我們的大多數泛型基類都是使用反射來實現的。這極大地減少了我們爲重複性任務編寫的代碼行數量。但是出現了性能問題。你採用了哪種解決方案? – 2009-06-30 06:59:57

+0

我們採用了非常類似的方法,現在正在緩存元數據。 – 2009-06-30 07:23:43

回答

53

反射需要加載大量的類型元數據,然後進行處理。這可能導致更大的內存開銷和更慢的執行。根據this article屬性修改約慢2.5x-3x,方法調用速度降低3.5x-4x。

下面是一個很好的MSDN article概述瞭如何更快地進行反射和開銷。如果你想了解更多信息,我強烈建議閱讀。

反射可能會增加代碼的複雜性,這使得代碼變得非常複雜,因此很難處理。有些人,如Scott Hanselman認爲,通過反思,你經常會遇到比解決問題更多的問題。如果您的團隊主要是初級開發人員,情況尤其如此。

如果您需要大量的動態行爲,您最好查看DLR(動態語言運行時)。隨着.NET 4.0中出現新的變化,您可能需要了解是否可以將其中的一些內容納入到您的解決方案中。從VB和C#中動態添加的支持使得使用動態代碼非常優雅,並且非常簡單地創建自己的動態對象。

祝你好運。

編輯:我做了一些更多的斯科特的網站戳,發現這個podcast反思。我沒有聽過,但它可能是值得的。

2

隨着巨大的權力來承擔巨大的責任。

正如您所說,反射會產生相關成本,並且取決於您做了多少反射,可能會顯着減慢應用程序的速度。

其中一個非常適合使用它的地方是IoC(控制反轉),因爲根據應用程序的大小,可能會有更多的好處。

1

非常感謝您的寶貴意見和建議,特別是Jr Devs的部分,這一點非常重要。

對我們來說是更容易爲我們的初級開發人員要做到這一點:

[TableName("Table")] 
public class SomeDal : BaseDal 
{ 
    [FieldName("Field")] 
    public string Field 
} 

而不是DAL的一些較大impelementations。這加快了他們構建DAL對象的速度,同時隱藏了高級開發人員所需的所有內部工作。

太糟糕了LINQ沒有早點出來,我覺得有時我們寫了一半。

15

有很多事情可以加快思考速度。例如,如果您正在進行大量財產訪問,那麼HyperDescriptor可能會有用。

如果您正在執行很多方法調用,那麼您可以使用Delegate.CreateDelegate緩存方法以鍵入代理 - 然後僅進行一次類型檢查(在CreateDelegate期間)。

如果你正在做很多的對象構造,那麼Delegate.CreateDelegate將不會幫助(你不能在構造函數中使用它) - 但是(在3.5)Expression可以用來做到這一點,再次編譯爲一個類型代表。

所以是的:反射是緩慢的,但你可以優化它,而不會太痛苦。

0

使用反射時有時會咬你的一件事是在重構時不使用反射更新調用。像resharper這樣的工具會提示你在更改方法名稱時更新註釋和字符串,這樣你就可以以這種方式捕獲大部分的方法,但是當你調用動態生成的方法或者動態生成方法名稱時,你可能會錯過了什麼。

唯一的解決方案是良好的文檔和徹底的單元測試。