2011-05-08 23 views
12

जो तेज़ है; event.Invoke(args) का उपयोग करके, या बस event(args) पर कॉल करें। क्या फर्क पड़ता है? एक दूसरे की तुलना में तेज़ या धीमा है; या यह सिर्फ वरीयता का मामला है?घटना। इन्वोक (तर्क) बनाम घटना (तर्क)। कौन सा तेज़ है?

+1

आप इसे खुद की कोशिश की? प्रोफाइल करें और देखें कि कौन सा बेहतर प्रदर्शन करता है? –

+0

कुछ क्लाइंट होने पर कोई फर्क नहीं पड़ता है, लेकिन मुझे चिंता है कि जब मैं इसे स्केल करता हूं तो क्या हो सकता है। मुझे इसे अपने नए उत्पाद में प्रकाशित करने से पहले निर्णय लेना होगा, जब एक कंप्यूटर संभावित रूप से हजारों नेटवर्क कनेक्शन से निपटने में सक्षम हो सकता है। – IDWMaster

+0

यह अच्छा होगा अगर कोई यह समझा सके कि दो तरीकों को लागू करने के तरीके में अंतर क्या है। – IDWMaster

उत्तर

35

लेखन someDelegate(...)someDelegate.Invoke(...) के लिए एक कंपाइलर शॉर्टेंड है।
वे दोनों उसी प्रतिनिधि आईडी Invoke विधि के लिए एक ही आईएल — callvirt निर्देश के लिए संकलित करते हैं।

Invoke विधि प्रत्येक ठोस प्रतिनिधि प्रकार के लिए कंपाइलर द्वारा उत्पन्न की जाती है।

इसके विपरीत, विधि, Delegate प्रकार पर परिभाषित विधि, प्रतिनिधि को कॉल करने के लिए प्रतिबिंब का उपयोग करती है और धीमी है।

9

जब आप event(args) पर कॉल करते हैं, तो सी # कंपाइलर इसे event.Invoke(args) के लिए आईएल कॉल में बदल देता है। यह वही बात है - string या System.String का उपयोग करना।

6

दोनों तरीकों से बिल्कुल वही आईएल उत्पन्न करना समाप्त होता है, इसलिए उन्हें कॉल करने में कोई अंतर नहीं होता है।

कहा जा रहा है कि, यदि आपके पास प्रदर्शन समस्याएं हैं, तो इस तरह के बदलाव आपको बहुत मदद करने की संभावना नहीं रखते हैं। यदि आपके पास प्रदर्शन समस्याएं नहीं हैं, तो इस तरह के प्रश्न पूछने का कोई कारण नहीं है।

2

सी # 6.0, Invoke में null-conditionals की शुरूआत के बाद से प्रतिनिधियों की थ्रेड-सुरक्षित नल-जांच को सरल बनाने के लिए उपयोग किया जा सकता है। कहाँ आपने पहले कुछ की तरह

var handler = event; 
if (handler != null) 
    handler(args); 

?. के संयोजन और Invoke आप बस लिखने के लिए अनुमति देता है क्या करना है जाएगा

event?.Invoke(args) 
संबंधित मुद्दे