प्रतिनिधियों में Invoke और DynamicInvoke के बीच क्या अंतर है? कृपया मुझे कुछ कोड उदाहरण दें जो उन दो तरीकों के बीच अंतर बताता है।Invoke और DynamicInvoke
उत्तर
जब आपके पास प्रतिनिधि प्रतिनिधि होता है, तो आपको सटीक प्रकार पता हो सकता है, या आप शायद यह जान सकें कि यह 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);
यह मतलब यह है कि उपयोग के DynamicInvoke मामले में संकलक प्रतिनिधि आमंत्रण को संभालने के लिए अधिक आईएल कोड उत्पन्न करते हैं? – testCoder
@testCoder नहीं, यह प्रतिबिंब –
का उपयोग करेगा, बहुत पूर्ण स्पष्टीकरण। – testCoder