.NET

2012-11-02 12 views
16

में गतिशील टाइपिंग का उपयोग करने की प्रदर्शन लागत dynamic बनाम object का उपयोग .NET में करने की प्रदर्शन लागत क्या है? उदाहरण के लिए कहें मेरे पास एक विधि है जो किसी भी प्रकार के पैरामीटर को स्वीकार करती है। E.G..NET

public void Foo(object obj) 
{ 
} 

या

public void Foo(dynamic obj) 
{ 
} 

ILSpy मुझसे कहता है कि जब गतिशील कोड का उपयोग कर, संकलक गतिशीलता को संभालने के लिए एक कोड ब्लॉक डालने होंगे। इसलिए मैं जानना चाहता हूं कि वस्तु के स्थान पर गतिशील उपयोग करने की सलाह दी जाती है और प्रदर्शन की लागत पर यह उपयोग किस स्तर पर आता है?

उत्तर

45

यह सटीक परिदृश्य पर बहुत निर्भर करेगा - लेकिन इसमें कैशिंग की एक परत है, इसलिए यह उतना भयानक नहीं है जितना आप उम्मीद कर सकते हैं (यह हर बार प्रतिबिंब नहीं करता है)। यह संचालन पर भी भिन्न हो सकता है (उदाहरण के लिए, "उठाया" शून्य-टी ऑपरेशंस काफी धीमे हैं)। आप को मापने के लिए की आवश्यकता होगी, लेकिन के रूप में यह होता है मैं सदस्य (संपत्ति) पहुँच के लिए यहाँ कुछ समय है, कि मैं ले लिया जब 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) 

चेतावनी: इन एक एकल परीक्षण है कि के प्रतिनिधि नहीं हो सकता है के लिए कर रहे हैं आपका परिदृश्य एक साधारण परीक्षण, के बारे में 20 बार की तुलना में स्थिर नियमित सी # धीमी पर आधारित है, लेकिन प्रतिबिंब से लगभग 30 गुना तेजी से: इस कोड shown here

तो है।

अद्यतन: दिलचस्प, लगता है प्रतिबिंब .NET 4.5 में तेज़ हो गया है:

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

यहाँ यह केवल बारे में 12 बार प्रतिबिंब की तुलना में तेजी है, क्योंकि प्रतिबिंब तेजी से (नहीं है क्योंकि गतिशील धीमी मिला) मिला है।

+0

क्या आप 'गतिशील सी #' परीक्षण को स्पष्ट कर सकते हैं: क्या आपने पहली कॉल के लिए समय माप लिया था, या बाद में (कैश) एक? मैं पूर्व मानता हूं और बाद में कॉल बहुत तेज़ हैं, लेकिन यकीन नहीं है। (मुझे पता है कि मैं इसे स्वयं परीक्षण कर सकता हूं, लेकिन मेरा मानना ​​है कि भविष्य के पाठकों को स्पष्टीकरण से भी फायदा होगा;) – enzi

22

इसलिए मैं जानना चाहता हूं कि वस्तु के स्थान पर गतिशील उपयोग करने की सलाह दी जाती है और प्रदर्शन की लागत पर यह उपयोग किस स्तर पर आता है?

यदि आपको गतिशील टाइपिंग की आवश्यकता नहीं है, तो इसका उपयोग न करें।

यदि आपको गतिशील टाइपिंग की आवश्यकता है - यदि यह कुछ जटिल प्रतिबिंब कोड से बचाता है, उदाहरण के लिए - तो इसका उपयोग करें और प्रदर्शन लागत को मापें।

लागत भारी आप जो भी कर रहे हैं उस पर निर्भर करती है। यह स्थिर रूप से टाइप किए गए कोड से काफी धीमा होगा जहां समकक्ष भी संभव है, लेकिन ऐसे कारकों के हैं जो सटीक लागत को प्रभावित कर सकते हैं। प्रदर्शन मामलों के साथ, सबसे साफ (आवश्यक रूप से सबसे छोटा) कोड लिखें जो शुरू करने के लिए काम करता है, प्रदर्शन को मापता है, और यदि यह आपके प्रदर्शन लक्ष्यों को पूरा नहीं करता है, तो ध्यान से अनुकूलित करें (यह जांचने के लिए लगातार माप के साथ कि आप जा रहे हैं सही दिशा)।