सवाल स्कैला में स्ट्रिंग कॉन्सटेनेशन महंगा है क्योंकि यह जावा में है?


जावा में, + ऑपरेटर का उपयोग करके तारों को जोड़ने के खराब प्रदर्शन के कारण स्ट्रिंगबिल्डर के साथ स्ट्रिंग कॉन्सटेनेशन करने के लिए यह एक आम सबसे अच्छा अभ्यास है। क्या स्कैला के लिए एक ही अभ्यास की सिफारिश की गई है या भाषा में सुधार हुआ है कि जावा अपने स्ट्रिंग कॉन्सटेनेशन कैसे करता है?


41
2017-12-22 19:12


मूल




जवाब:


स्कैला जावा स्ट्रिंग का उपयोग करता है (java.lang.String), इसलिए इसकी स्ट्रिंग कॉन्सटेनेशन जावा की तरह ही है: वही बात दोनों में हो रही है। (रनटाइम वही है, आखिरकार।) एक विशेष है StringBuilder स्कैला में कक्षा, जो "एक एपीआई के साथ संगत प्रदान करता है java.lang.StringBuilder"; देख http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html

लेकिन "सर्वोत्तम प्रथाओं" के संदर्भ में, मुझे लगता है कि ज्यादातर लोग आम तौर पर अधिकतम कुशल कोड की तुलना में सरल, स्पष्ट कोड लिखना बेहतर मानेंगे, सिवाय इसके कि वास्तविक प्रदर्शन समस्या या किसी एक की अपेक्षा करने का एक अच्छा कारण है। + ऑपरेटर में वास्तव में "खराब प्रदर्शन" नहीं होता है, यह बस यही है s += "foo" के बराबर है s = s + "foo" (यानी यह एक नया बनाता है String ऑब्जेक्ट), जिसका अर्थ यह है कि, यदि आप "एक स्ट्रिंग" की तरह दिखते हैं (जो दिखता है), तो आप अनावश्यक वस्तुओं को बनाने से बच सकते हैं - और एक स्ट्रिंग से दूसरे स्ट्रिंग को पहले से दोहराते हुए - एक स्ट्रिंग से दूसरे में दोबारा दोहराएं StringBuilder के बजाय एक String। आम तौर पर अंतर महत्वपूर्ण नहीं है। (बेशक, "सरल, स्पष्ट कोड" थोड़ा विरोधाभासी है: उपयोग करना += उपयोग कर सरल है StringBuilder स्पष्ट है लेकिन फिर भी, निर्णय आमतौर पर मामूली प्रदर्शन विचारों के बजाय कोड-लेखन विचारों पर आधारित होना चाहिए।)


38
2017-12-22 19:29



मेरे मामले में मैं प्रदर्शन के बारे में बहुत चिंतित हूं इसलिए मैं सवाल क्यों पूछ रहा हूं। सारी जानकारी के लिए शुक्रिया! - bionicseraph
AFAIK, JVM स्वचालित रूप से एक अभिव्यक्ति में बार-बार '+' concatenations का इलाज करता है जैसा कि यह एक स्ट्रिंगबफर करेगा। तो वास्तव में कोई प्रदर्शन अंतर नहीं है। - aishwarya
@ ऐश्वर्या: जेएलएस सिफारिश करता है कि कंपाइलर्स अनुकूलित करें foo + bar + baz + bip के बराबर के लिए new StringBuilder(foo).append(bar).append(baz).append(bip).toString() तथा "foo" + "bar" + "baz" + "bip" सेवा मेरे "foobarbazbip", लेकिन वे बहुत संकीर्ण मामले हैं। और मुझे नहीं लगता कि जेवीएम (कंपाइलर्स के विपरीत) आमतौर पर उन पंक्तियों के साथ किसी भी प्रकार का अनुकूलन करते हैं, हालांकि मैं गलत हो सकता हूं। - ruakh
पालतू peeve: ओ (एन) में एक स्ट्रिंगबिल्डर का उपयोग करते समय, एक लूप परिणामों में ओ (एन ^ 2) जटिलता में + का उपयोग कर। अतिरिक्त वस्तुएं एक मामूली समस्या है; जटिलता में विस्फोट एक प्रमुख है। - Philip Potter
@ फिलिपपोटर: अच्छा बिंदु। मैंने इसका जवाब उल्लेख करने के लिए संपादित किया है StringBuilder यह भी एक स्ट्रिंग से दूसरे स्ट्रिंग को पहले से दोहराए जाने से बचने में मदद करता है "। - ruakh


स्कालस स्ट्रिंग कॉन्सटेनेशन उसी तरह काम करता है जैसे जावा करता है।

val x = 5
"a"+"b"+x+"c"

का अनुवाद किया जाता है

new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()

स्ट्रिंगबिल्डर है scala.collection.mutable.StringBuilder। यही कारण है कि स्ट्रिंगबिल्डर को जोड़ा गया मान संकलक द्वारा बॉक्स किया गया है।

आप javap के साथ बाइटकोड decompile द्वारा व्यवहार की जांच कर सकते हैं।


19
2017-12-22 19:29





मैं जोड़ना चाहता हूं: यदि आपके पास स्ट्रिंग का अनुक्रम है, तो उनमें से एक नई स्ट्रिंग बनाने के लिए पहले से ही एक विधि है (सभी आइटम, समेकित)। इसे कहते हैं mkString

उदाहरण: (http://ideone.com/QJhkAG)

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"

3
2018-06-02 16:41





स्कैला का उपयोग करता है java.lang.String तारों के प्रकार के रूप में, तो यह एक ही विशेषताओं के अधीन है।


2
2017-12-22 19:28