2011-12-18 21 views
14

मैं इस प्रलेखन पृष्ठ, http://developer.android.com/reference/android/util/Log.html पढ़ रहा था।एंड्रॉइड स्ट्रिंगबिल्डर बनाम स्ट्रिंग कंसटेनेशन

अनुभाग यहाँ मेरी नजर पड़ी:

युक्ति: मत भूलना कि जब आप

Log.v(TAG, "index=" + i);

की तरह एक फोन करना है कि जब आप स्ट्रिंग का निर्माण कर रहे में पारित करने के लिए Log.d, कंपाइलर स्ट्रिंगबिल्डर का उपयोग करता है और कम से कम तीन आवंटन होते हैं: स्ट्रिंगबिल्डर स्वयं, बफर, और स्ट्रिंग ऑब्जेक्ट। वास्तव में, एक और बफर आवंटन और प्रतिलिपि भी है, और जीसी पर भी अधिक दबाव है। इसका मतलब है कि यदि आपका लॉग संदेश फ़िल्टर किया गया है, तो आप महत्वपूर्ण काम कर रहे हैं और महत्वपूर्ण ओवरहेड कर सकते हैं।

इसका तात्पर्य है कि एंड्रॉइड कंपाइलर स्ट्रिंग कॉन्सटेनेशन (+) ले रहा है और उन्हें स्ट्रिंगबिल्डर में परिवर्तित कर रहा है और कथन जोड़ सकता है।

क्या मेरी धारणा सही है या क्या स्ट्रिंगबिल्डर के बजाय मैन्युअल रूप से स्ट्रिंगबिल्डर का उपयोग करना बेहतर है?

+0

के संभावित डुप्लिकेट है [जावा में स्ट्रिंग संयोजन - उपयोग करने के लिए जब +, StringBuilder और concat] (http://stackoverflow.com/ प्रश्न/7817951/स्ट्रिंग-कॉन्सटेनेशन-इन-जावा-कब-टू-यूज-स्ट्रिंगबिल्डर-एंड-कॉन्सैट) – givanse

उत्तर

9

कंपाइलर ठीक वही करता है जो आप सुझाते हैं। आप जेनरेट की गई .class फ़ाइल के बाइटकोड प्रिंट कर सकते हैं (javap -c का उपयोग करके) और StringBuilder का निर्माण और उपयोग करने के लिए कॉल देखें।

हालांकि, स्ट्रिंग कॉन्सटेनेशन कोड की कई पंक्तियों पर फैलते समय आमतौर पर इसे मैन्युअल रूप से करने योग्य है। संकलक आमतौर पर + से जुड़े प्रत्येक स्ट्रिंग-मूल्यवान अभिव्यक्ति के लिए अलग StringBuilder आवंटित करता है।

+0

मैं इस बार गलत कर रहा हूं। >< –

+1

@ जेरेमीएड्स - हे। मैंने कहा है कि बहुत सी चीजों के बारे में। :) –

+2

** "आमतौर पर यह मैन्युअल रूप से करने योग्य है जब स्ट्रिंग कॉन्सटेनेशन कोड की कई पंक्तियों पर फैलता है" ** - मैं बस जोर देना चाहता था कि @TedHopp ने क्या कहा है, इसलिए यह खो नहीं गया है। मैं लगभग 10 लाइनों पर 250 वर्ण स्ट्रिंग को जोड़ रहा था और ऐप इंजन पर सीपीयू समय 350 एमसीसी था। जब मैंने इसे एक स्ट्रिंगबिल्डर के साथ बदल दिया, तो समय 50 एमसीसी तक गिर गया, अन्य चीजें अपरिवर्तित थीं। –

1

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

स्ट्रिंग कॉन्सटेनेशन (यानी, + का उपयोग करके, String myString = "Hello " + "World"; में) अन्य आवंटन के साथ पृष्ठभूमि में StringBuilder का उपयोग करता है। इस प्रकार, एक साधारण एक-बार concatenation के अलावा किसी भी अन्य चीज़ के लिए, StringBuilder स्वयं का उपयोग करना बेहतर होगा।

उदाहरण के लिए,

StringBuilder myString = new StringBuilder(); 
myString.append("Hello "); 
myString.append("to "); 
myString.append("everyone "); 
myString.append("in "); 
myString.append("the "); 
myString.append("world!"); 

की तुलना में बेहतर

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!"; 
+0

लेकिन अगर मेरी स्ट्रिंग सिर्फ इंडेक्स = "+ i 'है, तो सबसे अच्छा तरीका क्या है?(प्रदर्शन के लिए) – GMX

+0

@ जीएमएक्स, यह एक अच्छा सवाल है और मुझे लगता है कि यह संदर्भ पर निर्भर करेगा। यदि इसे केवल बार-बार कहा जाता है, तो '' index = "+ i' का उपयोग करके 'स्ट्रिंगबिल्डर' का उपयोग करने से कहीं अधिक पठनीय है। हालांकि, अगर इसे लूप के अंदर 1000 बार कहा जा रहा है और प्रदर्शन एक मुद्दा है, तो शायद कुछ प्रकार के 'स्ट्रिंगबिल्डर' विकल्प बेहतर होंगे। स्वीकार किए गए उत्तर का मुख्य बिंदु यह था कि जब स्ट्रिंग बनाने के लिए कोड की कई पंक्तियां होती हैं, तो निश्चित रूप से 'स्ट्रिंगबिल्डर' का उपयोग करें। – Suragch

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

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