2009-07-28 21 views
9

क्या कोई उदाहरण विधि और एक विस्तार विधि के बीच कोई प्रदर्शन अंतर है?प्रदर्शन विस्तार विधि बनाम उदाहरण विधि

+5

दोनों तरीकों से कोड लिखें। एक स्टॉपवॉच प्राप्त करें। तो आप जान लेंगे। –

उत्तर

17

विस्तार तरीकों मत भूलना सिर्फ स्थिर विधि वाक्यात्मक चीनी में लिपटे कॉल कर रहे हैं। तो क्या तुम सच में पूछ रहे हैं

है वहाँ स्थिर और उदाहरण तरीकों

जवाब है हां और वहाँ विभिन्न लेख

कुछ लिंक

इस विषय पर उपलब्ध हैं जो प्रदर्शन का अंतर है
+0

मैं उम्मीद कर रहा था कि आप इन लेखों में कुछ उद्धरण जोड़ने जा रहे हैं क्योंकि मुझे अभी तक कोई भी नहीं मिला है। शायद मैं गलत शब्दों को Google में डाल रहा हूं। –

+0

@ मुझे भी कॉल करें :)। मुझे लगता है कि मैंने पिछली बार सबमिट नहीं किया था। "सीएलआर विधि कॉल प्रदर्शन" के लिए गूगलिंग का प्रयास करें अधिकांश लेख सामान्य दृष्टिकोण लेते हैं लेकिन उदाहरण बनाम स्थिर मतभेदों पर चर्चा करेंगे। – JaredPar

+0

धन्यवाद - एक अच्छा पढ़ना पसंद है ... मैं जल्द ही वापस आऊंगा :) –

5

मुझे संदेह होगा कि कोई प्रदर्शन अंतर होगा क्योंकि यह सभी वाक्य रचनात्मक चीनी है। कंपाइलर बस इसे किसी अन्य विधि कॉल के रूप में संकलित करता है, सिवाय इसके कि यह एक अलग वर्ग पर एक स्थिर विधि है।

अपने ब्लॉग से कुछ अधिक जानकारी के वाक्यात्मक चीनी के बारे में: http://colinmackay.co.uk/2007/06/18/method-extensions/

+0

-1 अपने ब्लॉग में, आप एक स्थैतिक विधि की तुलना एक स्थैतिक विधि से कर रहे हैं। यह एक उदाहरण विधि से अलग है ... –

+0

वह ब्लॉग प्रविष्टि दो साल पहले लिखी गई थी, और इसका उद्देश्य इस सटीक प्रश्न का उत्तर नहीं देना था।मेरा समावेश यह दिखाने के लिए मोटे तौर पर था कि विस्तार के तरीके अंतर्निहित आईएल और विस्तार विधियों को सामान्य रूप से कैसे दिखाकर वाक्य रचनात्मक चीनी हैं। लेकिन, नीचे मतदान के लिए धन्यवाद! –

0

विधि में पारित तर्कों की संख्या के कारण थोड़ा सा प्रदर्शन अंतर है। तथ्य के कारण

 DateTime d = DateTime.Now; 

     MyClassInstance i = new MyClassInstance(0); 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementInstance(); 
     } 

     TimeSpan td = d - DateTime.Now; 

     DateTime e = DateTime.Now; 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementStatic(); 
     } 

     TimeSpan te = e - DateTime.Now; 

टीडी = 0.2499 सेकंड

ते = 0.2655 सेकंड

: निम्नलिखित कोड चल

public class MyClassInstance 
{ 
    public int MyProperty { get; set; } 

    public MyClassInstance(int prop) 
    { 
     MyProperty = prop; 
    } 

    public void IncrementInstance() 
    { 
     MyProperty++; 
    } 
} 

public static class MyClassStatic 
{ 
    public static void IncrementStatic(this MyClassInstance i) 
    { 
     i.MyProperty++; 
    } 
} 

: उदाहरण के लिए, निम्नलिखित वर्गों को देखो कि उदाहरण विधि को किसी भी तर्क को पारित करने की आवश्यकता नहीं है।

heres प्रदर्शन

+1

एक उदाहरण विधि कॉल में "इस" संदर्भ का क्या होता है? वह कहाँ जाता है? यह कैसे पारित हो जाता है? विधि को इसे कहीं से प्राप्त करने की आवश्यकता है? –

+0

अनिवार्य रूप से दोनों incrementInstance और incrementStatic MyProperty प्रॉपर्टी के लिए सेट विधि को कॉल करें। इंस्टेंस विधि सीधे इंस्टेंस मेमोरी को संदर्भित करती है, जबकि स्थिर विधि एक तर्क के रूप में पारित उदाहरण को संदर्भित करती है। –

+1

उत्सुकता से, मैंने आपका कोड लिया और इसे मेरी मशीन पर चलाया। जब मैं समान संख्या में पुनरावृत्तियों का उपयोग करता हूं क्योंकि आप नंबर एक दूसरे पर हॉप करते हैं। कभी-कभी इंस्टेंस विधियां जीतती हैं, कभी-कभी एक्सटेंशन विधियां भी होती हैं। मुझे लगता है कि टाइमर पर्याप्त ठीक नहीं है, इसलिए मैंने पुनरावृत्तियों को 2 अरब से अधिक (int.MaxValue) पर सेट किया है और अब मुझे काफी लगातार परिणाम मिल रहे हैं। इंस्टेंस विधि का उपयोग करके एक पुनरावृत्ति 46 नैनोसेकंड को पूरा करने में लगती है, और विस्तार विधि का उपयोग करके एक पुनरावृत्ति 45 नैनोसेकंड को पूरा करने में लगती है। मुझे कोई फर्क नहीं पड़ता कि मैं अंतर के नैनोसेकंद के आधार पर किसी भी तरह से किसी और को अनुकूलित करने जा रहा हूं। –

3

पर एक से थोड़ा दिनांकित है, लेकिन अच्छा लेख यह किसी भी महत्वपूर्ण अंतर नहीं है। this article देखें।

मैंने परीक्षण के परिणामों की पुष्टि की है, और एक और परीक्षण किया है जहां स्थैतिक संस्करण में Sample प्रकार के साथ पैरामीटर था। उन सभी ने 2.1 बिलियन कॉल के लिए अपने सिस्टम पर 11495 एमएमएस (+/- 4ms) लिया। जैसा कि लेख कहता है, आपको इसके बारे में चिंता नहीं करनी चाहिए।

यहां अधिकतर उदाहरण और परीक्षण मान्य नहीं हैं क्योंकि वे विधिवत इनलाइनिंग की अनुमति देते हैं। यदि विधि खाली है तो कंपाइलर पर विशेष रूप से आसान;)

(यह देखने के लिए दिलचस्प है कि लेख में मेरी तुलना में परीक्षण धीमा था .. यह बिल्कुल धीमा नहीं है, लेकिन यह 64 बिट ओएस के कारण हो सकता है)

+0

वह लिंक अब और काम नहीं करता है ... – takrl

+0

अगर मैं कहीं और कहां डालता हूं तो मैं लेखक के साथ जांच कर रहा हूं। इस बीच, आप इसे http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-method पर पढ़ सकते हैं -performance.aspx – Thorarin

+0

ठीक है, धन्यवाद, मैंने अपने वर्तमान ब्लॉग को भी देखा था लेकिन यह अब और नहीं था। – takrl

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