की डिफ़ॉल्ट क्षमता StringBuilder
की डिफ़ॉल्ट क्षमता क्या है?स्ट्रिंगबिल्डर
और जब डिफ़ॉल्ट (या नहीं) डिफ़ॉल्ट का उपयोग किया जाना चाहिए?
की डिफ़ॉल्ट क्षमता StringBuilder
की डिफ़ॉल्ट क्षमता क्या है?स्ट्रिंगबिल्डर
और जब डिफ़ॉल्ट (या नहीं) डिफ़ॉल्ट का उपयोग किया जाना चाहिए?
आदरणीय जे स्कीट ठीक इस समस्या का एक अच्छा विश्लेषण उपलब्ध कराते: StringBuilder की
:
[संपादित करें समय में, सवाल के बारे में StringList
पूछा] क्या आप मतलब StringCollection
है? यह प्रारंभ में खाली ArrayList
का उपयोग करता है, इसलिए उत्तर 0 है। और आपके पास इसे बदलने का कोई विकल्प नहीं है। जब आप पहली बार कोई आइटम जोड़ते हैं, तो क्षमता 4 तक पहुंच जाती है, फिर भरने पर दोगुनी रणनीति का उपयोग करती है।
आप List<string>
मतलब है, तो यह इसी तरह की है (एक खाली T[]
, न कि एक ArrayList
), लेकिन आप एक ज्ञात आकार को प्रारंभ कर सकते हैं अगर आप की जरूरत है (यानी आप जानते हैं कि आप कितना डेटा उम्मीद)। दोबारा, पहली बार Add
List<T>
पर आकार 4 तक कूदता है, फिर हर बार जब यह भर जाता है तो दोगुना हो जाता है।
मुझे लगता है कि उसका मतलब स्ट्रिंगबिल्डर था, और कुछ नहीं। –
भ्रम के लिए खेद है –
आह; तो एक अलग सवाल का एक अच्छा जवाब ... ओह ठीक है ;-( –
Stringbuilder capacity के बारे में सुनें, नमूना ऐप भी साबित करने के लिए है।
वह लिंक किया गया आलेख अधिकतम क्षमता को संदर्भित करता है। डिफ़ॉल्ट क्षमता (16) –
डिफ़ॉल्ट क्षमता 16 वर्णों (मैं पता लगाने के लिए नेट परावर्तक थे)।
डिफ़ॉल्ट 16 है, जो .NET ढांचे में किसी भी प्रकार की सरणी या सूची की डिफ़ॉल्ट क्षमता प्रतीत होता है। आपके स्ट्रिंगबिल्डर पर आवश्यक पुनर्वितरण की कम संख्या, बेहतर यह है। इस बीच, यह भी आवश्यकतानुसार बहुत अधिक आवंटित करने के लिए अनावश्यक है।
मैं आमतौर पर स्ट्रिंगबिल्डर के अंतिम आकार के रूप में किसी प्रकार के किसी न किसी अनुमान के साथ स्ट्रिंगबिल्डर को तुरंत चालू करता हूं। उदाहरण के लिए, यह कुछ पुनरावृत्ति गिनती पर आधारित हो सकता है जिसे आप बाद में स्ट्रिंग बनाने के लिए उपयोग करेंगे, इस पुनरावृत्ति में प्रत्येक आइटम के लिए आवश्यक आकार।
// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder (count * 96);
for (int i = 0; i < count; i++)
{
...
}
जब एक StringBuilder का आकार अगले स्ट्रिंग लिखने के लिए बहुत छोटा है, StringBuilder के आंतरिक चार सरणी में दो बार अपने वर्तमान आकार को पुनः आवंटन किया गया है।
यह वास्तव में स्वीकार्य उत्तर होना चाहिए –
यह प्रश्न आज दूसरे के डुप्लिकेट के रूप में आया, लेकिन मुझे लगता है कि एक भाग का उत्तर नहीं दिया गया था। डिफ़ॉल्ट (माना जाता है कि "जब आवश्यक स्ट्रिंग के साथ नहीं बनाया गया है) 16 लोगों ने कहा है, लेकिन मुझे इसे बदलने के समय यहां कुछ भी नहीं दिख रहा है।
जब आप इसे बदलते हैं तो आप इसे बदलते हैं संभवतः एक अनुकूल अनुकूलन के रूप में ऐसा कर सकते हैं। वास्तव में, 16 की पसंद अनुकूलन के विपरीत है। अनुकूलन मूल्यों और दृष्टिकोणों को चुन रहा है ताकि विशेष रूप से किसी विशेष मामले या संभावित मामलों के सबसेट के अनुरूप हो, ("चीजों को तेज़ी से नहीं बनाना "आम तौर पर, हालांकि हम इस शब्द का अक्सर उपयोग करते हैं)। यहां कक्षा के डिजाइनर को सामान्यीकरण से निपटना पड़ा - मूल्यों और दृष्टिकोणों को चुनना ताकि मामलों की एक विस्तृत श्रृंखला में उचित प्रदर्शन किया जा सके।
वे छोटे थे, स्मृति का कम उपयोग।
जितना बड़ा वे गए, बड़े तारों से निपटने के लिए कम पुनर्वितरण।
बाइनरी दौर (दो की पूरी शक्तियां) कुछ मामलों में अन्य संख्याओं की तुलना में बेहतर प्रदर्शन करने की संभावना है, इसलिए वे उनमें से एक के लिए गए, लेकिन उस विकल्प को 4 या 16 या 1024 के बीच छोड़ दिया गया विभिन्न संभावित मूल्यों को संतुलित करने का मामला था।
किसी को StringBuilder
का उपयोग करने के बजाए, इसका बेहतर विचार हो सकता है कि उन्हें किस आकार की आवश्यकता हो सकती है।
वे तार कि लंबाई में 43 अक्षरों तक के साथ कुल योग Append
5 1 अंकों की संख्या के लिए जा रहे हैं, तो StringBuilder
की कुल लंबाई कोई बात नहीं क्या 48 वर्ण होने जा रहा है, ताकि वे की क्षमता का उपयोग करना चाहिए 48 के रूप में 48 48 लंबाई की एक स्ट्रिंग के लिए हमेशा सबसे कुशल आकार है।
वे कुछ जहां के बारे में 23 और 34 वर्ण के बीच किसी भी लम्बाई हो सकता है कर रहे हैं, वे 34.
का उपयोग करना चाहिए कि वे कुछ जहां संभावना कभी नहीं अधिक से अधिक 60 वर्ण हो जाएगा कर रहे हैं, लेकिन हर अब और फिर वहां हो सकता है, उन्हें 64 का उपयोग करना चाहिए (अधिकांश हिस्सों के लिए पुन: आवंटित न करें, और कुछ मामलों के लिए उपर्युक्त शक्ति का लाभ प्राप्त करें)।
यदि इस पर निष्कर्ष निकालना असंभव है, या कम से कम कठिन प्रदर्शन करने के लिए और प्रदर्शन हॉट-स्पॉट नहीं है, तो आपको केवल डिफ़ॉल्ट का उपयोग करना चाहिए।
हम StringBuilder
कक्षा की क्षमता संपत्ति का उपयोग कर क्षमता पा सकते हैं:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
यहाँ क्षमता StringBuilder
के डिफ़ॉल्ट क्षमता को परिभाषित करता है।
StringBuilder
Max Capacity
Int32
के अधिकतम मूल्य के समान है। एक स्ट्रिंग-बिल्डर के
डिफ़ॉल्ट क्षमता 16 वर्णों, और स्ट्रिंग-बिल्डर के मैक्स क्षमता 2147483647 पात्रों है।
इसलिए लंबी प्रतिक्रिया संग्रहीत करने की चिंता करने की कोई आवश्यकता नहीं है !!!
क्या आप दस्तावेज़ीकरण के लिए एक लिंक जोड़ सकते हैं जहां इसकी पुष्टि हुई है? –
मैंने अपनी परियोजना में कोशिश की है। यदि आप कोशिश करना चाहते हैं तो आप इसे dotnetfiddle.net में अभ्यास कर सकते हैं। –
यह एक अच्छा अनुस्मारक है कि मुझे "क्षमता" शब्द शामिल करने के लिए आलेख को संपादित करना चाहिए "कहीं :) –
अच्छा लेख, लेकिन किसी भी सवाल का जवाब नहीं देता है। – Webveloper
@ जोन्स स्केट - अभी भी शब्द क्षमता खो रहा है। हालांकि दिलचस्प लेख। – flacnut