2009-12-29 18 views
5

तो ... मैं जहाँ मैं एक foreach पाश कि स की एक सूची के माध्यम से लूप जांच करने के लिए चयन किया जाता है जो है इस परिदृश्य है। प्रत्येक चयनित चेकबॉक्स के लिए, मुझे एक बहुत लंबी स्ट्रिंग कॉन्सटेनेशन करना है, जिसमें 20 वर्णों की औसत लंबाई के 30 अलग-अलग तार शामिल हैं, और फिर इसे HTTP अनुरोध के रूप में भेजें। तारों में से 2 चयनित चेकबॉक्स के सूचकांक/मान पर निर्भर हैं।स्ट्रिंग कड़ी बनाम स्ट्रिंग बिल्डर संलग्न

स की सूची की लंबाई उपयोगकर्ता के डाटा के आधार पर भी चर रहा है। मैं कहूंगा कि सूची की औसत लंबाई 20 होगी, लेकिन यह 50-60 तक जा सकती है। तो सबसे खराब स्थिति परिदृश्य 60 या इतने बार पूरे स्ट्रिंग concatenation प्रदर्शन करेगा।

अब मैं '+' ऑपरेटर के माध्यम से सरल स्ट्रिंग संयोजन के साथ कर रहा हूँ के लिए

, लेकिन अगर यह stringbuilder साथ यह करने के लिए तेजी से होगा मैं सोच रहा हूँ। बेशक, इसका मतलब है कि मुझे या तो लूप के भीतर एक स्ट्रिंगबिल्डर ऑब्जेक्ट बनाना होगा, या लूप से पहले इसे बनाना होगा और स्ट्रिंगबिल्डर को कॉल करना होगा। HTTP अनुरोध भेजने के बाद इसके अंत में हटाएं।

मैं सराहना किसी भी अंतर्दृष्टि किसी को भी इस मुद्दे के बारे में साझा कर सकते हैं।

संपादित
सभी उत्तर सबके लिए धन्यवाद, मैं क्या इकट्ठा किया है, मुझे इस करने के बारे में जाना से सबसे अच्छा तरीका है के लिए किया जाएगा तो कुछ की तरह:

+0

मैं क्षमा चाहता हूं, ऐसा लगता है कि मैं स्ट्रिंगबिल्डर को काफी अच्छी तरह समझ नहीं पा रहा हूं। तो स्ट्रिंगबिल्डर को कॉल करना। टॉस्ट्रिंग() स्ट्रिंगबिल्डर को साफ़ करता है? – Kronon

+0

नहीं। लंबाई संपत्ति को शून्य पर सेट करना इसे साफ़ करता है। –

+0

someStringBuilder.length = 0; –

उत्तर

14

उपयोग StringBuilder। यही वह है।

स्ट्रिंग्स अपरिवर्तनीय हैं। स्ट्रिंग संयोजन एक नया स्ट्रिंग, और अधिक स्मृति की आवश्यकता होगी, बनाता है, और आम तौर पर धीमी गति से माना जाता है:

string a = "John" + " " + "Saunders"; 

यह एक स्ट्रिंग "जॉन" बनाता है, फिर एक और स्ट्रिंग "जॉन सॉन्डर्स" बनाता है, फिर अंत में, प्रदान करती है "एक" है कि । कचरा संग्रह के लिए "जॉन" छोड़ा गया है। के रूप में "जॉन" एक नया स्ट्रिंग "जॉन" है, जो एक नया स्ट्रिंग "जॉन सॉन्डर्स" की जगह ले लेती है

string a = "John"; 
a += " "; 
a += "Saunders"; 

यह लगभग समान है। मूल को कचरा इकट्ठा करने के लिए छोड़ दिया जाता है।

दूसरी ओर, StringBuilder संलग्न किया जा करने के लिए हटा दिया बनाया गया है, आदि


उदाहरण:

StringBuilder sb = new StringBuilder(); 
for (int i=0; i<n; i++) 
{ 
    sb.Length = 0; 
    sb.Append(field1[i]); 
    sb.Append(field2[i]); 
    ... 
    sb.Append(field30[i]); 
    // Do something with sb.ToString(); 
} 
+0

किसी कारण से मुझे यह जवाब पसंद आया .. –

+0

अगर मेरा प्रश्न बेवकूफ लग रहा था, तो मैं क्षमा चाहता हूं, लेकिन मैं सोच रहा था कि प्रत्येक लूप पर एक नया स्ट्रिंगबिल्डर ऑब्जेक्ट बनाने से अनावश्यक ओवरहेड होता है। – Kronon

+0

आप एक नया क्यों बनाना चाहते हैं? –

2

मैं करूंगा सामान्य में StringBuilder का उपयोग करने की अनुशंसा करें।

आप इस परीक्षण किया है और प्रदर्शन जाँच की है? प्रदर्शन एक मुद्दा बना रहा है कि कोड कोड को फिर से लिखने में आपको कितना समय लगेगा?

+0

मैं इस परियोजना के साथ काफी कुछ कर रहा हूं, इसलिए अब मैं बेहतर प्रदर्शन के लिए अपने कोड को अनुकूलित करने के विभिन्न तरीकों को देख रहा हूं। – Kronon

5

इस विषय को पिछले कुछ वर्षों में मौत के लिए विश्लेषण किया गया है। अंत परिणाम यह है कि यदि आप एक छोटी, ज्ञात संख्या में संगतता कर रहे हैं, तो '+' का उपयोग करें, अन्यथा स्ट्रिंगबिल्डर का उपयोग करें। आपने जो कहा है उससे, '+' के साथ मिलकर तेजी से होना चाहिए। वहां विश्लेषण करने के लिए वहां एक गजलियन (दे या ले) साइटें हैं - इसे Google करें।

स्ट्रिंग के आकार के लिए आप बात कर रहे हैं, वैसे भी यह नगण्य है।

संपादित करें: दूसरे विचार पर, एसबी शायद तेज़ है। लेकिन जैसे मैंने कहा, कौन परवाह करता है?

+2

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

+0

जैसा कि मैं संपादन कर रहा था :) मुझे लगता है कि एसबी तेजी से हो सकता है, लेकिन याद रखें कि स्ट्रिंग के सभी 'डिस्किंग' को जीसी द्वारा नियंत्रित किया जाता है, जो इसका एक बहुत ही कुशल काम करता है, और वास्तव में इसका प्रबंधन नहीं करता है वर्तमान निष्पादन पथ। –

+0

यह अभी भी अनावश्यक जीसी काम है जिसे आसानी से टाला जा सकता है ... ऐसा नहीं है कि हम 2 या 3 स्ट्रिंग्स के बारे में बात कर रहे हैं ... –

2

यदि आप यह प्रश्न पूछ रहे हैं, संभावना है कि आपको कई कारणों से स्ट्रिंगबिल्डर का उपयोग करना चाहिए, लेकिन मैं दो प्रदान करूंगा।

  1. आप स्ट्रिंग संयोजन का उपयोग करते हैं यह एक नया बफर आवंटित और और नए स्ट्रिंग चर में अन्य स्ट्रिंग में डेटा की प्रतिलिपि है। तो आप कई बार आवंटित करने जा रहे हैं। अंत में जो मेमोरी को खंडित करता है, ढेर की जगह का उपयोग करता है, और कचरा कलेक्टर के लिए और अधिक काम करता है। दूसरी तरफ स्ट्रिंगबिल्डर एक बफर को पूर्व-आवंटित करता है और जब आप इसमें स्ट्रिंग जोड़ते हैं तो उसे फिर से आवंटित रखने की आवश्यकता नहीं होती है (माना जाता है कि प्रारंभिक बफर पर्याप्त है)। जो प्रदर्शन को बढ़ाता है और स्मृति पर बहुत कम कर लगाता है।

  2. डेवलपर्स के रूप में हमें भविष्य के विकास की उम्मीद करने की कोशिश करनी चाहिए। आइए मान लें कि आपकी सूची समय के साथ काफी बढ़ती है और फिर अचानक धीरे-धीरे प्रदर्शन करना शुरू हो जाता है। यदि आप अब थोड़ा प्रयास करके इसे रोक सकते हैं, तो आप ऐसा क्यों नहीं करेंगे?

6

मैं इस उत्तर दिया गया है पता है, लेकिन मैं मैं वास्तव में लगता है कि "आँख बंद करके स्वीकार कर लिया सुसमाचार" के रूप में हमेशा StringBuilder का उपयोग करने का दृष्टिकोण कभी कभी गलत है, और यह एक मामला है का कहना है चाहता था। http://geekswithblogs.net/johnsperfblog/archive/2005/05/27/40777.aspx

यह की कमी है, इस विशेष मामले के लिए, के रूप में वर्णित है, आप बेहतर प्रदर्शन thusly StringBuilder से बचने और + ऑपरेटर का उपयोग करके देखेंगे::

पृष्ठभूमि के लिए, इस ब्लॉग प्रविष्टि देखें

foreach (CheckBox item in FriendCheckboxList) 
{ 
    if (item.Checked) 
    { 
     string request = string1 + 
      string2 + 
      string3 + 
      . 
      . 
      . 
      stringLast; 
     SendRequest(request); 
    } 
} 

कारण यह है कि सी # कंपाइलर (.NET 1.1 के रूप में), उस कथन को स्ट्रिंग में एक एकल आईएल कॉल में परिवर्तित कर देगा। कॉनकैट स्ट्रिंग्स की एक सरणी को तर्क के रूप में पास कर देगा। ब्लॉग एंट्री स्ट्रिंग.कोनकैट के कार्यान्वयन विवरणों की रूपरेखा के बारे में एक उत्कृष्ट नौकरी करता है, लेकिन कहने के लिए पर्याप्त है, यह इस मामले के लिए बेहद कुशल है।

+0

इसे लाने के लिए धन्यवाद। बहुत से लोग मानते हैं कि वे जीसी कॉल की बचत कर रहे हैं जब वे नहीं हो सकते हैं। यदि यह प्रदर्शन से संबंधित है और यह वास्तव में मायने रखता है तो इसे मापें! बहुत कम "हमेशा एक्स का उपयोग करें" नियम हैं जो सही हैं। –

+1

जब संयोजित करने के लिए तारों की एक निश्चित संख्या होती है, तो स्ट्रिंग। कॉनकैट अब तक बेहतर है। इसे करने की ज़रूरत है स्ट्रिंग लम्बाई का कुल जोड़ना, स्मृति आवंटित करना, प्रत्येक स्ट्रिंग की प्रतिलिपि बनाना, और आपका काम पूरा हो गया है। यदि आप अधिक प्रसंस्करण करने की उम्मीद करते हैं, तो स्ट्रिंगबिल्डर शायद बेहतर है। – Todd

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