2012-08-02 21 views
5

मैं .NET Gotchas (एक पढ़ा हुआ आईएमओ के लायक) के रूप में एक पुस्तक पढ़ रहा हूं, जो स्ट्रिंग और स्ट्रिंगबिल्डर के बीच प्रदर्शन अंतर को दर्शाता है, और यह एक प्रश्न उठाता है जिसे मैं महसूस नहीं किया जा सकता अनुत्तरित! जबकि मैं किसी भी वर्ग के आंतरिक (इन वर्गों के प्रतिबिंबित संस्करणों को देखे बिना) नहीं जानता, मैं सोच रहा था; चूंकि .NET में ऑपरेटर ओवरलोड करने योग्य हैं, माइक्रोसॉफ्ट स्ट्रिंगबिल्डर का आंतरिक रूप से उपयोग करने के लिए स्ट्रिंग क्लास को क्यों लागू नहीं करता है और कंसेटेशन ऑपरेटर को बस कॉल करने के लिए अधिभारित करता है। स्ट्रिंगबिल्डर में एपेंड()। मुझे लगता है कि कुछ अंतर्निहित कारण हैं कि यह मामला क्यों नहीं है, और यदि हां, तो क्यों?.NET स्ट्रिंग concatenation (+ & + =) बनाम स्ट्रिंगबिल्डर

उत्तर

6

समस्या इतनी अधिक नहीं है कि स्ट्रिंग कॉन्सटेनेशन धीमा है, यह दोहराया गया है कि दोहराव संगतता बहुत से मध्यवर्ती तार बनाती है जिसे आवंटित करने की आवश्यकता होती है और बाद में कचरा इकट्ठा किया जाता है।

संपादित
ध्यान दें कि mystring += "a" सरल नहीं जोड़ता है "एक" पिछले स्ट्रिंग के लिए। यह संयोजन के लिए एक नई स्ट्रिंग बनाता है और इसके लिए "mystring" को इंगित करता है, जिससे पिछले मान को छोड़ दिया जाता है (यदि इसमें कोई और संदर्भ नहीं है)।

अंत संपादित

string mystring = "something"; 
mystring += "something else"; 
mystring = mystring + "third"; 

की एक श्रृंखला में धीमी है अगर आप एक StringBuilder संलग्न के रूप में प्रत्येक अलग लाइन एक .ToString द्वारा पीछा कर प्रदर्शन करेंगे() परिणाम एक स्ट्रिंग में वापस पाने के लिए। यदि आप एक स्ट्रिंगबिल्डर, एपेंड() को बार-बार उपयोग करते हैं और बहुत अंत में .ToString() करते हैं तो आपको केवल एक प्रदर्शन लाभ मिलेगा।

StringBuilder sb = new StringBuilder(); 
sb.Append("something"); 
sb.Append("something else"); 
sb.Append("third"); 
string mystring = sb.ToString(); 

और फिर एक StringBuilder यह खुद भूमि के ऊपर है इतना है कि यह आप लाभ नहीं होगा यदि आप शामिल होने के लिए स्ट्रिंग-भागों की एक छोटी संख्या है है।

ध्यान दें कि संकलक एक भी बयान में एक संयोजन दूर का अनुकूलन:

string mystring = "something" + "something else" + "third"; 

सबसे तेज है।

5

वजह साफ है:

क्योंकि

string result = a + b; 

से

var sb = new StringBuilder(a, a.Length + b.Length); 
sb.Append(b); 
string result = sb.ToString(); 

StringBuilder अधिक कुशल केवल भावना जब concatenations के बहुत हो रही हैं बनाने रहा है आम तौर पर एक लूप के अंदर, है।

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