2012-11-02 11 views
16

在.NET中使用dynamic vs object的性能成本是多少?說例如我有一個方法接受任何類型的參數。例如。在.NET中使用動態類型的性能成本

public void Foo(object obj) 
{ 
} 

public void Foo(dynamic obj) 
{ 
} 

ILSpy告訴我,使用動態代碼時,編譯器必須插入一個代碼塊來處理活力。因此,我想知道是否建議使用動態來代替對象,以及這種用法在性能成本上達到了什麼水平?

回答

45

這將取決於確切的場景 - 但有一個內置的緩存層,所以它不像您所期望的那樣糟糕(它不會每次都會進行反射)。它也可以在操作上有所不同(例如,「取消」可空行T操作明顯較慢)。您將需要來衡量,但它發生了,我這裏有一些時機與成員(屬性)的訪問,我把做FastMember時:

Static C#: 14ms 
Dynamic C#: 268ms 
PropertyInfo: 8879ms (aka reflection) 
PropertyDescriptor: 12847ms (aka data-binding) 
TypeAccessor.Create: 73ms (aka FastMember) 
ObjectAccessor.Create: 92ms (aka FastMember) 

警告:這是一個測試可能不具有代表性的你的場景。此代碼爲shown here

因此:基於簡單測試,比靜態常規C#慢大約20倍,但比反射速度快大約30倍。

UPDATE:有趣,看起來像在思考.NET 4.5速度越來越快:

Static C#: 13ms 
Dynamic C#: 249ms 
PropertyInfo: 2991ms 
PropertyDescriptor: 6761ms 
TypeAccessor.Create: 77ms 
ObjectAccessor.Create: 94ms 

這比反射快只有約12倍,因爲反射了快(不是因爲動態越來越慢)。

+0

您能否澄清'Dynamic C#'測試:您是否測量了第一次調用或後續(緩存)的時間?我假設前者和後續的通話速度要快得多,但不確定。 (我知道我可以自己測試,但我相信未來的讀者也會從澄清中受益) – enzi

22

因此,我想知道是否建議使用動態來代替對象,以及這種用法在性能成本上達到了什麼水平?

如果您不需要動態輸入,請不要使用它。

如果您需要動態打字 - 例如,如果它避免了一些複雜的反射代碼 - 然後使用它並測量性能成本。

成本將沉重完全取決於你在做什麼。它幾乎總是比靜態類型的代碼慢,其中等效的代碼甚至可能,但是有很多因素可以影響確切的成本。與性能問題一樣,編寫最簡潔(不一定最短)的代碼,測試性能,如果它不符合性能目標,請仔細優化(通過頻繁測量來檢查您是否正在進入正確的方向)。