2010-08-17 8 views
6

संभावित डुप्लिकेट:
Pass by value vs Pass by reference performance C#.net
संदर्भ द्वारा मूल्यों को पारित करने से गति में काफी सुधार होता है?

किसी को भी पहले से ही है, तो संदर्भ द्वारा पैरामीटर प्रदान करने के काफी तेजी सिर्फ उन्हें प्रति बनाने की बजाय है का परीक्षण किया था?

लेकिन सवाल का मुख्य फोकस यह है: क्या इसका उपयोग करने के विपरीत रेफरी कीवर्ड का उपयोग करने के कोई नुकसान हैं?

+0

इस धागे को देखें: http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref – MUG4N

+0

यह टूल पुराना है लेकिन धन्यवाद –

उत्तर

14

नहीं, यह गति में काफी सुधार नहीं करता है, या कुछ भी नहीं। इसके विपरीत, ref कीवर्ड का उपयोग करके आप एक और स्तर का संकेत जोड़ रहे हैं जो केवल कोड को धीमा कर सकता है।

पैरामीटर सामान्य रूप से मूल्य से पारित होते हैं, जिसका अर्थ है कि उनकी प्रतिलिपि बनाई गई है। int जैसे साधारण मानों के लिए, इसका मतलब यह है कि मूल्य की एक प्रति स्टैक पर रखी जाती है।

string जैसे संदर्भ प्रकारों के लिए इसका मतलब है कि संदर्भ की एक प्रति स्टैक पर रखी गई है। इसलिए, इसका मतलब यह नहीं है कि पूरी वस्तु की प्रतिलिपि बनाई गई है, यह केवल उस ऑब्जेक्ट का संदर्भ है जिसकी प्रतिलिपि बनाई गई है।

आपको आमतौर पर ref या out कीवर्ड का उपयोग नहीं करना चाहिए, जब तक ऐसा करने का कोई विशेष कारण न हो।

+1

एक छोटा नाइटपिक: यदि आपके पास * बड़ी * संरचना फिर इसे रेफरी से गुज़रने से प्रदर्शन में थोड़ा सुधार हो सकता है। ऐसा कहने पर, यदि आपकी संरचना इतनी बड़ी है कि वैल द्वारा इसे पारित करने से प्रदर्शन पर असर पड़ता है तो आपको गंभीरता से प्रकार को फिर से सक्रिय करने के बारे में सोचना चाहिए, और * इसे * रेफरी के आसपास पास करने के बारे में नहीं सोचना चाहिए। – LukeH

+0

मैं समझ नहीं पा रहा हूं, अगर 'स्ट्रिंग' तर्क का उपयोग करते समय केवल संदर्भ पारित किया जाता है, तो पास किए गए परिवर्तन को बदलते समय उस मूल चर को कैसे बदला जाता है? स्मृति में स्ट्रिंग की एक नई प्रति होना चाहिए (या मैं गलत हूँ?)। और अगर मैं प्रसंस्करण (या पार्सिंग, लेकिन बदल नहीं रहा) वास्तव में बड़ी स्ट्रिंग कर रहा हूं, तो क्या यह 'ref' द्वारा इसे पारित करने के लिए तेज़ नहीं होगा? समझाने के लिए शुक्रिया :)। – Buksy

+0

@ बुक्स: मान द्वारा पारित संदर्भ प्रकार (जैसे स्ट्रिंग) का पैरामीटर का अर्थ है कि संदर्भ की एक प्रति पास की गई है। यदि आप पैरामीटर बदलते हैं, तो यह मूल संदर्भ को प्रभावित नहीं करता है। यहां एक और कारक यह है कि तार अपरिवर्तनीय हैं, इसलिए आप मूल स्ट्रिंग को कभी भी नहीं बदल सकते हैं। यदि आप संदर्भ द्वारा एक स्ट्रिंग पैरामीटर भेजते हैं, तो आप मूल संदर्भ बदल सकते हैं ताकि यह एक अलग स्ट्रिंग ऑब्जेक्ट को इंगित कर सके।चूंकि तार अपरिवर्तनीय हैं, इसलिए उन्हें यह सुनिश्चित करने के लिए प्रतिलिपि बनाने की आवश्यकता नहीं है कि कोई विधि उन्हें परिवर्तित नहीं कर सकती है, जो मूल्य कुशल द्वारा तारों को पार कर जाती है। – Guffa

3

, मूल्य प्रकार और सी #

संदर्भ प्रकार के मामले में में संदर्भ प्रकार के होते हैं ref कीवर्ड बिना उन्हें गुजर संदर्भ गुजर मतलब है। मैंने इसका परीक्षण नहीं किया, लेकिन मैं उम्मीद करता हूं कि कंपाइलर के कार्यान्वयनकर्ता और .NET ढांचे ने जितनी जल्दी हो सके उन्हें पारित किया। मैं कल्पना नहीं कर सकता कि उन संदर्भों के संदर्भों को पार करना संदर्भों को पहले स्थान पर पार करने से तेज़ है। यह समझ में नहीं आता है।

मूल्य प्रकारों के मामले में, यह एक और कहानी है। यदि कोई संरचना बड़ी है, तो इसे कॉपी करना निश्चित रूप से महंगा है, और संदर्भ पारित करना तेज होना चाहिए। लेकिन मूल्य प्रकार एक कारण के लिए मूल्य प्रकार के लिए हैं। यदि आपके पास मूल्य प्रकार और है, तो आप इसे फ़ंक्शंस में पास करने की दक्षता के बारे में चिंतित हैं, शायद आपने इसे एक मूल्य प्रकार बनाने में गलती की है।

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

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