2009-12-01 5 views
51

मैं स्ट्रिंगबिल्डर के लाभों को समझता हूं।स्ट्रिंगबिल्डर का उपयोग कब करें?

लेकिन अगर मैं 2 स्ट्रिंग्स को जोड़ना चाहता हूं, तो मुझे लगता है कि स्ट्रिंगबिल्डर के बिना ऐसा करने के लिए यह बेहतर (तेज़) है। क्या ये सही है?

स्ट्रिंगबिल्डर का उपयोग करने के लिए किस बिंदु पर (स्ट्रिंग्स की संख्या) बेहतर हो जाती है?

+1

मेरा मानना ​​है कि यह पहले से कवर किया गया है। –

+2

कई बार –

+1

संभावित डुप्लीकेट: http://stackoverflow.com/questions/529999, http://stackoverflow.com/questions/550702, http://stackoverflow.com/questions/1612797, http: // stackoverflow। कॉम/प्रश्न/21078, http://stackoverflow.com/questions/73883, –

उत्तर

57

मैं आपको जेफ एटवुड द्वारा The Sad Tragedy of Micro-Optimization Theater पढ़ने के लिए गर्मजोशी से सुझाव देता हूं।

यह सरल कंसटेनेशन बनाम स्ट्रिंगबिल्डर बनाम अन्य तरीकों का इलाज करता है।

अब, अगर आप कुछ संख्या और रेखांकन देखने के लिए लिंक का पालन करें, चाहते हैं;)

+0

+1! इस बारे में चिंता करने में समय बिताया गया है कि समय ऐसा कुछ नहीं कर रहा है जो वास्तव में मायने रखता है। –

+5

आपका पठन गलत है हालांकि: इससे कोई फर्क नहीं पड़ता कि जब कोई लूपिंग शामिल नहीं होती है, तो अन्य मामलों में हालांकि यह एक एलओटी – Peter

+0

पर ध्यान दे सकता है मैंने संपादन को हटा दिया है, क्योंकि यह एक स्वीकृत उत्तर में गलत जानकारी थी । – Peter

1

स्ट्रिंगबिल्डर का उपयोग करने के लिए एक एकल concatenation लायक नहीं है। मैंने आमतौर पर अंगूठे के नियम के रूप में 5 concatenations का उपयोग किया है।

8

वास्तव में नहीं ... आपको स्ट्रिंगबिल्डर का उपयोग करना चाहिए यदि आप बड़े स्ट्रिंग्स को जोड़ते हैं या आपके पास लूप में कई कॉन्सटेनेशन हैं।

+1

का संभावित डुप्लिकेट गलत है। आपको केवल 'स्ट्रिंगबिल्डर' का उपयोग करना चाहिए यदि लूप या कॉन्सटेनेशन चश्मा के लिए एक प्रदर्शन समस्या है। गलत सामान्यीकरण के लिए –

+0

-1। स्ट्रिंग एस = "ए" + "बी" + "सी" + "डी"; एस के लिए एक स्मृति आवंटन का उपयोग करता है। स्ट्रिंग के लिए अंतिम (9वीं) अधिभार देखें। कॉनकैट। उपरोक्त कोड मूल रूप से स्ट्रिंग के लिए संकलित हो जाता है। एमएसआईएल में कॉनकैट ("ए", "बी", "सी", "डी")। –

+2

@Alex: क्या यह हमेशा मामला नहीं है? ;) नहीं, गंभीरता से, मैंने हमेशा एक लूप के अंदर concatenation के लिए स्ट्रिंगबिल्डर का उपयोग किया है ... हालांकि, मेरे loops सभी में 1k से अधिक पुनरावृत्तियों है ... @ बाइनरी: आम तौर पर, इसे 'स्ट्रिंग एस = "abcd" ', कम से कम यह आखिरी बात मैंने सुना है ... हालांकि, चर के साथ, सबसे अधिक संभावना है, Concat। – Bobby

4

लेकिन अगर मैं 2 तारों को संयोजित करना चाहता हूं, तो मुझे लगता है कि स्ट्रिंगबिल्डर के बिना ऐसा करने के लिए यह बेहतर (तेज़) है। क्या ये सही है?

हां। लेकिन अधिक महत्वपूर्ण बात यह है कि ऐसी स्थितियों में वेनिला strings का उपयोग करने के लिए यह पठनीय है। दूसरी तरफ, एक लूप में इसका उपयोग करना, समझ में आता है और संयोजक के रूप में भी पठनीय हो सकता है।

मैं अंगूठे के नियमों से सावधान रहूंगा जो एक सीमा के रूप में संगतता की विशिष्ट संख्या का हवाला देते हैं। लूप्स में इसका उपयोग करना (और केवल लूप) शायद उतना ही उपयोगी, याद रखना आसान है और अधिक समझ में आता है।

+0

"मैं अंगूठे के नियमों से सावधान रहूंगा जो एक सीमा के रूप में संगतता की विशिष्ट संख्या का हवाला देते हैं" <यह। साथ ही, सामान्य ज्ञान लागू होने के बाद, 6 महीने के समय में आपके कोड पर आने वाले व्यक्ति के बारे में सोचें। _yes_ के लिए –

34

लेकिन अगर मैं 2 तार concatinate चाहते हैं, तो मुझे लगता है कि यह बेहतर (तेज) करना है यह स्ट्रिंगबिल्डर के बिना। क्या ये सही है?

कि वास्तव में सही है, तो आप पा सकते हैं क्यों बिल्कुल पर बहुत अच्छी तरह से समझाया,

http://www.yoda.arachsys.com/csharp/stringbuilder.html

अभिव्यक्त किया है: अगर आप की तरह

var result = a + " " + b + " " + c + .. 

एक ही बार में तार concatinate कर सकते हैं स्ट्रिंगबिल्डर के बिना बेहतर है केवल प्रतिलिपि बनाने के लिए (परिणामस्वरूप स्ट्रिंग की लंबाई पहले से गणना की जाती है);

structurs लिए

तरह
var result = a; 
result += " "; 
result += b; 
result += " "; 
result += c; 
.. 

नई वस्तुओं हर बार बनाई गई हैं, इसलिए वहां आपके StringBuilder विचार करना चाहिए।

अंत लेख अंगूठे का इन नियमों का सार पर:

अंगूठे

तो के

नियम, जब आप StringBuilder, का उपयोग करना चाहिए और जब आप स्ट्रिंग संयोजन ऑपरेटरों इस्तेमाल करना चाहिए?

  • निश्चित रूप से StringBuilder का उपयोग करते हैं आप एक गैर तुच्छ पाश में श्रृंखलाबद्ध रहे हैं - खासकर यदि आप (संकलन समय पर) यकीन है कि के लिए पता नहीं है कि कितने पुनरावृत्तियों आप के माध्यम से बनाती हूँ पाश। उदाहरण के लिए, एक फ़ाइल को वर्ण एक समय में पढ़ना, स्ट्रिंग का निर्माण करना जब आप + = ऑपरेटर का उपयोग करते हैं तो संभावित रूप से प्रदर्शन आत्महत्या होती है।

  • निश्चित रूप से संयोजन ऑपरेटर जब आप कर सकते हैं (readably) सब कुछ जो एक बयान में श्रेणीबद्ध होने की जरूरत है निर्दिष्ट का उपयोग करें। (आप CONCATENATE के लिए चीजों की एक सरणी है हैं, तो String.Concat स्पष्ट रूप से बुला पर विचार -। या String.Join अगर आप परिसीमक जरूरत है)

  • कई में शाब्दिक तोड़ने के लिए डरो मत concatenated बिट्स - परिणाम वही होगा। उदाहरण के लिए प्रदर्शन के लिए कोई नुकसान नहीं होने के कारण, आप लंबी अवधि के को कई पंक्तियों में तोड़कर पठनीयता की सहायता कर सकते हैं।

  • आप कुछ संयोजन की अगले चरण खिला के अलावा अन्य के लिए संयोजन की मध्यवर्ती परिणाम की जरूरत है, StringBuilder आपकी सहायता करने वाला नहीं है। उदाहरण के लिए, यदि आप पहले नाम और अंतिम नाम से एक पूर्ण नाम बनाते हैं, और फिर जानकारी के तीसरे भाग ( उपनाम, शायद) अंत में जोड़ें, तो आप केवल स्ट्रिंगबिल्डर का उपयोग करने से लाभ लेंगे यदि आपको अन्य उद्देश्य के लिए स्ट्रिंग (पहले नाम + अंतिम नाम) स्ट्रिंग की आवश्यकता नहीं है (जैसा कि हम उदाहरण में करते हैं जो एक व्यक्ति ऑब्जेक्ट बनाता है)।

  • आप बस कुछ concatenations क्या करना है, और तुम सच में अलग बयानों में उन्हें क्या करना चाहते हैं, तो यह नहीं वास्तव में ऐसा मामला है जिस तरह से आप जाना है। कौन सा रास्ता पर concatenations आकार स्ट्रिंग के शामिल की संख्या, और किस क्रम वे में श्रेणीबद्ध कर रहे हैं निर्भर करेगा और अधिक कुशल है। क्या तुम सच में लगता है कि कोड के उस टुकड़े एक प्रदर्शन टोंटी, प्रोफ़ाइल या होने के लिए दोनों तरीकों से बेंचमार्क करें।

8

System.String अपरिवर्तनीय वस्तु है - इसका मतलब है कि जब भी आप अपनी सामग्री को संशोधित यह एक नया स्ट्रिंग आवंटित करेगा और इस समय लगता है (और स्मृति?)। स्ट्रिंगबिल्डर का उपयोग करके आप ऑब्जेक्ट की वास्तविक सामग्री को बिना किसी नए आवंटित किए संशोधित करते हैं।

तो स्ट्रिंगबिल्डर का उपयोग करें जब आपको स्ट्रिंग पर कई संशोधन करने की आवश्यकता होती है।

4

कोई निश्चित उत्तर नहीं है, केवल नियम-अंगूठे हैं। अपने स्वयं के व्यक्तिगत नियम कुछ इस तरह जाना:

  • तो एक पाश में श्रृंखलाबद्ध, हमेशा एक StringBuilder का उपयोग करें।
  • यदि तार बड़े हैं, तो हमेशा StringBuilder का उपयोग करें।
  • यदि कॉन्सटेनेशन कोड स्क्रीन पर साफ और पठनीय है तो यह शायद ठीक है।
    यदि यह नहीं है, तो StringBuilder का उपयोग करें।
+0

मुझे पता है कि यह एक पुराना विषय है, लेकिन मुझे केवल सीखना है और यह जानना चाहता था कि आप "बड़ी स्ट्रिंग" के रूप में क्या मानते हैं? – MatthewD

2

मुझे नहीं लगता कि उपयोग कब या कब नहीं के बीच एक अच्छी रेखा है। बेशक किसी ने सुनहरे परिस्थितियों के साथ बाहर आने के लिए कुछ व्यापक परीक्षण किए।

मेरे लिए, मैं स्ट्रिंगबिल्डर का उपयोग नहीं करूँगा अगर केवल 2 विशाल तारों को जोड़ता है। यदि एक अनिश्चितवादी गिनती के साथ लूप है, तो मुझे लगता है कि लूप छोटी गणना भी हो सकता है।

+0

वास्तव में स्ट्रिंगबिल्डर को 2 तारों को जोड़ने के लिए यह पूरी तरह से गलत होगा, लेकिन यह perf के साथ कुछ भी नहीं है। परीक्षण - यह गलत चीज़ के लिए इसका उपयोग कर रहा है। –

3

जब तक आप शारीरिक रूप से कॉन्सटेनेशन (ए + बी + सी ...) टाइप कर सकते हैं, तो इससे कोई बड़ा अंतर नहीं होना चाहिए। एन वर्ग (एन = 10 पर) एक 100 एक्स मंदी है, जो बहुत खराब नहीं होना चाहिए।

बड़ी समस्या तब होती है जब आप सैकड़ों तारों को जोड़ते हैं। एन = 100 पर, आपको 10000X बार मंदी मिलती है। जो बहुत बुरा है।

4

तब करोगे तू गिनती तीन व्याख्या करने के लिए, कोई और अधिक, कम नहीं। तीनों की संख्या आप गिना जाएगा, और गिनती की संख्या तीन होगी। चार आप गिनेंगे, न तो आप दोनों को गिनें, सिवाय इसके कि आप तीन आगे बढ़ें। एक बार नंबर तीन, तीसरे नंबर जा रहा है, पहुँचा जा, तो lobbest तू अन्ताकिया

की तेरा पवित्र हथगोला मैं आम तौर पर कोड के किसी भी ब्लॉक जो तीन या अधिक तार के संयोजन में परिणाम होगा के लिए स्ट्रिंग बिल्डर का उपयोग करें।

+0

यह निर्भर करता है: कंसेटेशन केवल एक प्रतिलिपि बनाता है: "रसेल" + "" + स्टीन + "।", केवल एक प्रतिलिपि बनायेगा क्योंकि यह पहले स्ट्रिंग की लंबाई को कैल्स करता है। केवल तभी जब आपको अपनी समाप्ति को विभाजित करना होगा, तो आपको एक निर्माता के बारे में सोचना शुरू करना चाहिए – Peter

2
  • आप एक पाश में तार जोड़ हैं, तो आप नियमित रूप से स्ट्रिंग
  • के बजाय StringBuilder का उपयोग कर मामले में विचार करना चाहिए यह एक संयोजन है, तो आप नहीं निष्पादन समय में अंतर सभी

यहाँ पर देख सकते हैं है

class Program 
{ 
    static void Main(string[] args) 
    { 
     const int testLength = 30000; 
     var StartTime = DateTime.Now; 

     //TEST 1 - String 
     StartTime = DateTime.Now; 
     String tString = "test string"; 
     for (int i = 0; i < testLength; i++) 
     { 
      tString += i.ToString(); 
     } 
     Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); 
     //result: 2000 ms 

     //TEST 2 - StringBuilder 
     StartTime = DateTime.Now; 
     StringBuilder tSB = new StringBuilder("test string"); 
     for (int i = 0; i < testLength; i++) 
     { 
      tSB.Append(i.ToString()); 
     } 
     Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); 
     //result: 4 ms 

     Console.ReadLine(); 
    } 
} 

परिणाम::

0,123,516 बात साबित करने के लिए एक साधारण परीक्षण अनुप्रयोग है
  • 30'000 पुनरावृत्तियों

    • स्ट्रिंग - 2000 एमएस
    • StringBuilder - 4 एमएस
  • 1000 पुनरावृत्तियों

    • स्ट्रिंग - 2 एमएस
    • काटें ngBuilder - 1 एमएस
  • 500 पुनरावृत्तियों

    • स्ट्रिंग - 0 एमएस
    • StringBuilder - 0 एमएस