2013-06-11 9 views
5

लौटने अगर मैंसंकलक अनुकूलन जब तार

private string Foo(string decrypted) 
{ 
    return decrypted.Substring(blah); 
} 

और

private string Foo(string decrypted) 
{ 
    string s = decrypted.Substring(blah); 
    return s; 
} 

यह एक ही है है? क्या संकलक s को हटाने में सक्षम है?

कैसे

private string Foo(string decrypted) 
{ 
    string s = decrypted.Substring(blah); 
    string t = s; 
    return t; 
} 

के बारे में?

धन्यवाद।

+2

इससे कोई फर्क क्यों पड़ता है? 'स्ट्रिंग' एक संदर्भ प्रकार है, इसलिए यदि इसे अनुकूलित नहीं किया गया था तो यह दो अतिरिक्त शब्द-आकार की प्रतियां सबसे खराब होगी। वह मूंगफली है। – delnan

+1

इससे कोई फर्क नहीं पड़ता, यह ओ (1) समय अंतर पहला सामान्य रूप से अधिक पठनीय है, इसलिए इसका उपयोग करें। जब दूसरा दूसरा पठनीय है, तो उस –

उत्तर

1

ऐसा लगता है कि सवाल मूल रूप से है "क्या सी # कंपाइलर समर्थन named return value optimization (एनआरवीओ) है?"

यह एक उचित सवाल है, मुझे लगता है, लेकिन delnan points out की तरह, यह विशेष रूप से प्रासंगिक नहीं है क्योंकि सी # में स्ट्रिंग संदर्भ प्रकार हैं। यदि आप एक सी ++ प्रोग्रामर हैं, तो आप संदर्भ प्रकारों के बारे में सोच सकते हैं जो अनिवार्य रूप से पॉइंटर्स के बराबर हैं। तो यद्यपि आप मूल्य से स्ट्रिंग को वापस कर रहे हैं, आप वास्तव में केवल संदर्भ पर मूल्य के आधार पर लौट रहे हैं, ऑब्जेक्ट स्वयं ही नहीं। ऐसा लगता है कि आप मूल्य के आधार पर सूचक पते लौट रहे थे। पूरे स्ट्रिंग ऑब्जेक्ट की एक प्रति नहीं बनाई जानी चाहिए, इसलिए ऑप्टिमाइज़ेशन आपको बहुत कम लाभ देता है। एनआरवीओ की आवश्यकता होने का एकमात्र कारण यह है कि एक बड़ी और महंगी प्रतिलिपि के प्रदर्शन हिट से पीड़ित होने से बचें, लेकिन एक सूचक/संदर्भ की प्रतिलिपि महंगा नहीं है।

हालांकि, यदि आपने एक अलग उदाहरण दिया है जो एक संदर्भ प्रकार (उदाहरण के लिए, एक बड़ी संरचना) के बजाय मूल्य प्रकार का उपयोग करता है, तो एनआरवीओ लागू करके प्राप्त करने के लिए एक महत्वपूर्ण प्रदर्शन सुधार हो सकता है। दुर्भाग्यवश, यहां तक ​​कि इस मामले में, मुझे विश्वास नहीं है कि सी # कंपाइलर यह करता है। मुझे लगता है कि जेआईटीर हो सकता है; मैं निश्चित रूप से नहीं कह सकता। (और यदि यह अब नहीं किया गया है, तो इसे हमेशा भविष्य के संस्करणों में जोड़ा जा सकता है। हालांकि ऐसी बड़ी संरचनाएं शायद ही कभी सी # कोड में पाई जाती हैं, इसलिए यह संभव नहीं है कि यह प्रदर्शन टीम की लक्ष्यों की सूची के शीर्ष पर है।)

अधिक जानकारी के लिए, सी # में References and Values पर जॉन स्कीट का लेख पढ़ने की अनुशंसा की जाती है।

4

मैं उत्सुक था, इसलिए मैंने इसे आजमाया (ऑप्टिमाइज़ेशन के साथ LINQPad 4 का उपयोग करके)। यह मैं क्या मिल गया है:

private string Foo(string decrypted) 
{ 
    return decrypted.Substring(0); 
} 
Foo: 
IL_0000: ldarg.1  
IL_0001: ldc.i4.0  
IL_0002: callvirt System.String.Substring 
IL_0007: ret   

private string Foo(string decrypted) 
{ 
    string s = decrypted.Substring(0); 
    return s; 
} 
Foo: 
IL_0000: ldarg.1  
IL_0001: ldc.i4.0  
IL_0002: callvirt System.String.Substring 
IL_0007: stloc.0  // s 
IL_0008: ldloc.0  // s 
IL_0009: ret  

private string Foo(string decrypted) 
{ 
    string s = decrypted.Substring(0); 
    string t = s; 
    return t; 
} 
Foo: 
IL_0000: ldarg.1  
IL_0001: ldc.i4.0  
IL_0002: callvirt System.String.Substring 
IL_0007: stloc.0  // s 
IL_0008: ldloc.0  // s 
IL_0009: stloc.1  // t 
IL_000A: ldloc.1  // t 
IL_000B: ret  

ऐसा प्रतीत होता है संकलक दूर s या t अनुकूलन नहीं करता, फिर भी, मुझे लगता है JIT दुभाषिया होगा।

+0

का उपयोग करें, क्या यह ऑप्टिमाइज़ेशन के साथ रिलीज़ मोड से है? (डीबग मोड निश्चित रूप से उन्हें छोड़ देगा) – viraptor

+0

@viraptor मैंने LINQPad के भीतर अनुकूलन चालू कर दिया, हां। LINQPad के अनुसार, यह "विजुअल स्टूडियो के 'रिलीज' मोड के बराबर है और लाइव निष्पादन ट्रैकिंग अक्षम करता है" –

+1

रिलीज विजुअल स्टूडियो * से रिलीज * निश्चित रूप से अतिरिक्त चर को हटा दें। (मैंने अभी इसका परीक्षण किया) तो ऐसा लगता है कि लिंककपड क्या कहता है सच नहीं है। प्रतिबिंबक में यह दिखाता है: 'वापस डिक्रिप्ट किया गया। सब्स्ट्रिंग (0); ' –

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