2012-02-03 16 views
8

संभव डुप्लिकेट:
Why is String.Concat not optimized to StringBuilder.Append?क्यों स्ट्रिंग कंसटेनेशन स्वचालित रूप से स्ट्रिंगबिल्डर में C# में कनवर्ट नहीं किया गया है?

एक दिन मैं मेरा एक दोस्त के लिए एक विशेष Telerik नियंत्रण के बारे में ranting था। मैंने उनसे कहा कि नियंत्रण वृक्ष उत्पन्न करने में कई सेकंड लग गए, और प्रोफाइलिंग के बाद मुझे पता चला कि यह स्ट्रिंगबिल्डर के बजाय लूप में स्ट्रिंग कॉन्सटेनेशन का उपयोग कर रहा है। पुनर्लेखन के बाद यह लगभग तत्काल काम किया।

तो मेरे दोस्त ने यह सुना और ऐसा आश्चर्यचकित हुआ कि सी # कंपाइलर ने जावा कंपाइलर की तरह स्वचालित रूप से रूपांतरण नहीं किया था। एरिक लिपर्ट के कई उत्तरों को पढ़ते हुए मुझे एहसास हुआ कि इस सुविधा ने इसे नहीं बनाया क्योंकि इसे पर्याप्त योग्य समझा नहीं गया था। लेकिन अगर, अनुमानतः, लागत को लागू करने के लिए लागत कम थी, तो क्या तर्क इसे करने से रोक देगा?

+2

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

+1

यह भी देखें http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – SLaks

+1

इस पोस्ट को भी देखें: http: //pranayamr.blogspot। कॉम/2011/02/क्यों-टू-यूज़र-स्ट्रिंगबिल्डर-ओवर-स्ट्रिंग.html –

उत्तर

9

मैं ध्यान दें कि इस

Why is String.Concat not optimized to StringBuilder.Append?

की एक सटीक डुप्लिकेट तो यह शायद बंद किया जाना चाहिए है।

लेकिन अगर, अनुमानतः, लागत को लागू करने के लिए लागत कम थी, तो क्या तर्क इसे करने से रोक देगा?

ऐसा लगता है जैसे आप एक ट्यूटोलॉजी का प्रस्ताव दे रहे हैं: यदि एक्स नहीं करने का कोई कारण नहीं है, तो क्या एक्स नहीं करने का कोई कारण है? सं।

मुझे hypothetical, counterfactual प्रश्नों के उत्तर जानने में थोड़ा महत्व दिखाई देता है।

वहाँ प्रोग्रामिंग कर रहे हैं जिन भाषाओं में इस अनुकूलन का उपयोग करें: शायद पूछने के लिए एक बेहतर सवाल एक सवाल असली दुनिया के बारे में हो सकता है?

हां। JScript.NET में, हम लूप में स्ट्रिंग कॉन्सटेनेशन का पता लगाते हैं और कंपाइलर उन्हें स्ट्रिंग बिल्डर को कॉल में बदल देता है।

तो साथ पालन किया जा सकता है कि:

JScript नेट और सी # के बीच मतभेद है कि एक भाषा में, लेकिन अन्य में नहीं अनुकूलन का औचित्य साबित में से कुछ क्या हैं?

जेस्क्रिप्ट की मूल धारणा।नेट यह है कि इसके प्रोग्रामर ज्यादातर जावास्क्रिप्ट प्रोग्रामर होने जा रहे हैं, और उनमें से कई पहले ही पुस्तकालयों का निर्माण कर चुके हैं जिन्हें ईसीएमएस्क्रिप्ट के किसी भी कार्यान्वयन में चलाना चाहिए। उन प्रोग्रामर शायद .NET ढांचे को अच्छी तरह से नहीं जानते हैं, और यदि वे ऐसा करते हैं, तो हो सकता है कि वे स्ट्रिंगबिल्डर का उपयोग अपने लाइब्रेरी कोड को गैर-पोर्टेबल बनाने के बिना नहीं कर पाएंगे। यह भी मानना ​​उचित है कि जावास्क्रिप्ट प्रोग्रामर या तो नौसिखिया प्रोग्रामर हो सकते हैं, या प्रोग्रामर जो कंप्यूटर विज्ञान में अध्ययन के पाठ्यक्रम के बजाय व्यवसाय की अपनी लाइन के माध्यम से प्रोग्रामिंग में आए थे।

सी # प्रोग्रामर कहीं अधिक नेट ढांचे में अच्छी तरह से पता करने के लिए, पुस्तकालयों कि ढांचे के साथ काम लिखने के लिए, और अनुभवी प्रोग्रामर जो समझते हैं होने की संभावना है क्यों looped स्ट्रिंग संयोजन O (n) अनुभवहीन कार्यान्वयन में है । उन्हें इस अनुकूलन को संकलक द्वारा उत्पन्न किया गया है क्योंकि वे इसे आवश्यक मानते हैं तो वे इसे स्वयं ही कर सकते हैं।

संक्षेप में: कंपाइलर सुविधाएं ग्राहक के लिए मूल्य जोड़ने के लिए हमारे बजट खर्च करने के बारे में हैं; आप JScript.NET को फीचर जोड़कर "बैंग फॉर हिरन" प्राप्त करते हैं, इससे आप इसे सी # में जोड़ते हैं।

+0

धन्यवाद। हालांकि मैंने टॉटोलॉजी का प्रस्ताव नहीं दिया है। कभी-कभी वैचारिक कारणों के लिए विशेषताओं को जोड़ा नहीं जाता है, केवल शुद्ध लागत (डिजाइन, कार्यान्वयन, परीक्षण के लिए)। उदाहरण के लिए, आपने स्वयं को बताया है कि सी # में एक .EEEE एक्सटेंशन शामिल नहीं है क्योंकि यह अनावश्यक अस्पष्टता पेश करेगा। इस oneliner जोड़ने के लिए लागत miniscule हैं, और फिर भी तर्क उनके साथ असंबंधित है। लेकिन मुझे लगता है कि आपका अंतिम निष्कर्ष मेरे दोस्त के साथ उपयोग करने के लिए एक संतोषजनक तर्क है। –

+0

@RomanR .: मुझे उस पर संदेह है। क्या आप एक वैचारिक निर्णय का एक उदाहरण पेश कर सकते हैं जो सच्चाई में लागत-आधारित निर्णय भी नहीं बनाता है? – Brian

+0

@ ब्रायन: रोमनआर का उदाहरण एक अच्छा है; हम बहुत कम लागत के लिए 'IENumerable ' पर एक FOREach एक्सटेंशन विधि कर सकते हैं, और कुछ लाभ लेकिन मेरे दिमाग में, यह LINQ की "भावना" के साथ फिट नहीं है, जो साइड इफेक्ट्स से बचने के लिए है। यह सुविधा करने के खिलाफ "अंक" है। निश्चित रूप से ऐसा करने के खिलाफ बजटीय तर्क भी है, अर्थात् बेहतर सुविधा नहीं करने का अवसर लागत। लेकिन इसके खिलाफ अंक अंक हैं, और इसके खिलाफ सभी बिंदु लागत आधारित नहीं हैं। –

6

सी # कंपाइलर उससे बेहतर करता है।

a + b + cString.Concat(a, b, c) को संकलित किया गया है, जो कि तेजी StringBuilder से
"a" + "b" सीधे "ab" (बहु-रेखाओं के लिए उपयोगी) के लिए संकलित किया गया है।

StringBuilder का उपयोग करने का एकमात्र स्थान एक लूप के अंदर दोहराव के साथ मिलकर होता है; संकलक आसानी से अनुकूलित नहीं कर सकता है।

+0

क्या यह वास्तव में तेज है कि स्ट्रिंग्स के आकार और संख्या के बावजूद यह वास्तव में तेज़ है? – Shredderroy

+3

यह * बिल्कुल * प्रश्न क्या बात कर रहा है, यद्यपि: एक लूप में concatenating। –

+1

@ कोडीग्रे: मुझे यह विश्वास करना मुश्किल लगता है कि जावा इसे अनुकूलित करता है। – SLaks

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

  • कोई संबंधित समस्या नहीं^_^