2012-10-12 10 views
102

प्रतिनिधियों में Invoke और DynamicInvoke के बीच क्या अंतर है? कृपया मुझे कुछ कोड उदाहरण दें जो उन दो तरीकों के बीच अंतर बताता है।Invoke और DynamicInvoke

उत्तर

160

जब आपके पास प्रतिनिधि प्रतिनिधि होता है, तो आपको सटीक प्रकार पता हो सकता है, या आप शायद यह जान सकें कि यह Delegate है। यदि आप सही प्रकार जानते हैं, तो आप Invoke का उपयोग कर सकते हैं, जो बहुत तेज़ है - सबकुछ पहले से ही पूर्व-मान्य है। उदाहरण के लिए:

Func<int,int> twice = x => x * 2; 
int i = 3; 
int j = twice.Invoke(i); 
// or just: 
int j = twice(i); 

हालांकि! यदि आपको पता है कि यह Delegate है, तो इसे मैन्युअल रूप से पैरामीटर आदि को हल करना होगा - इसमें अनबॉक्सिंग आदि शामिल हो सकते हैं - बहुत सारे प्रतिबिंब चल रहे हैं। उदाहरण के लिए:

Delegate slowTwice = twice; // this is still the same delegate instance 
object[] args = { i }; 
object result = slowTwice.DynamicInvoke(args); 

नोट मैं args लंबे हाथ है कि एक object[] शामिल है यह स्पष्ट करने के लिए लिखा है। वहाँ अतिरिक्त लागत के बहुत सारे यहां हैं:

  • सरणी
  • पारित कर दिया तर्क मान्य एक वास्तविक MethodInfo
  • unboxing आदि के रूप में आवश्यक
  • प्रतिबिंब-आह्वान
  • तो
  • के लिए "फिट" कर रहे हैं कॉलर को वापसी मूल्य

मूल रूप से DynamicInvoke से बचने के लिए कुछ करने की आवश्यकता है ओह आप कर सकते हैं। Invoke हमेशा बेहतर होता है, जब तक आपके पास Delegate और object[] नहीं है।

एक प्रदर्शन तुलना के लिए, (एक सांत्वना exe) डिबगर के बाहर रिलीज़ मोड में निम्न प्रिंट:

Invoke: 19ms 
DynamicInvoke: 3813ms 

कोड:

Func<int,int> twice = x => x * 2; 
const int LOOP = 5000000; // 5M 
var watch = Stopwatch.StartNew(); 
for (int i = 0; i < LOOP; i++) 
{ 
    twice.Invoke(3); 
} 
watch.Stop(); 
Console.WriteLine("Invoke: {0}ms", watch.ElapsedMilliseconds); 
watch = Stopwatch.StartNew(); 
for (int i = 0; i < LOOP; i++) 
{ 
    twice.DynamicInvoke(3); 
} 
watch.Stop(); 
Console.WriteLine("DynamicInvoke: {0}ms", watch.ElapsedMilliseconds); 
+3

यह मतलब यह है कि उपयोग के DynamicInvoke मामले में संकलक प्रतिनिधि आमंत्रण को संभालने के लिए अधिक आईएल कोड उत्पन्न करते हैं? – testCoder

+1

@testCoder नहीं, यह प्रतिबिंब –

+2

का उपयोग करेगा, बहुत पूर्ण स्पष्टीकरण। – testCoder

संबंधित मुद्दे