StringBuffer.append () की तुलना में + कम ऑपरेटर है


91

मेरी टीम में, हम आम तौर पर इस तरह से स्ट्रिंग कॉन्फेंटेशन करते हैं:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

स्पष्ट रूप से निम्नलिखित बहुत अधिक पठनीय है:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

लेकिन जेएस विशेषज्ञों का दावा है कि +ऑपरेटर की तुलना में कम प्रदर्शन है StringBuffer.append()। क्या यह वास्तव में सच है?


92
जावास्क्रिप्ट में कोई स्ट्रिंग स्ट्रिंगर नहीं है
टॉमस

7
डॉन, क्या आप जावा का जिक्र कर रहे थे?
जेम्स मैकमोहन

मेरा अनुभव यह था कि [].join('')वास्तव में कुछ वायर्ड व्यवहार दिखाया गया है, इसलिए मैं +: - /
martyglaubitz

1
मुझे पता है कि यहाँ मौलिक प्रश्न स्ट्रिंग के संयोजन के बारे में है, लेकिन इस तरह से html तत्वों को बनाते समय आपको सावधानी बरतनी चाहिए। यदि आपका उदाहरण urlशामिल है 'या हो सकता है \n
स्टाइल जूल

जवाबों:


46

Internet Explorer एकमात्र ऐसा ब्राउज़र है जो वास्तव में आज की दुनिया में इससे ग्रस्त है। (संस्करण ५, ६, और slow कुत्ते धीमे थे। deg समान गिरावट नहीं दिखाते हैं।) क्या अधिक है, IE धीमा हो जाता है और धीमी गति से लंबा होता है।

यदि आपके पास लंबे समय तक तार है तो निश्चित रूप से एक array.join तकनीक का उपयोग करें। (या इस के आसपास कुछ स्ट्रिंगर रैपर, पठनीयता के लिए।) लेकिन अगर आपके तार कम हैं तो परेशान न करें।


102

आपका उदाहरण एक अच्छा नहीं है, यह बहुत कम संभावना नहीं है कि प्रदर्शन सांकेतिक रूप से अलग होगा। आपके उदाहरण में पठनीयता को ट्रम्प प्रदर्शन करना चाहिए क्योंकि एक बनाम दूसरे का प्रदर्शन लाभ लापरवाह है। एक सरणी (StringBuffer) के लाभ केवल तब स्पष्ट होते हैं जब आप कई कॉन्सेप्ट कर रहे होते हैं। फिर भी आपका माइलेज आपके ब्राउज़र पर निर्भर करता है।

यहां एक विस्तृत प्रदर्शन विश्लेषण है जो कई अलग-अलग ब्राउज़रों में जावास्क्रिप्ट के सभी तरीकों का उपयोग करके प्रदर्शन दिखाता है; स्ट्रिंग प्रदर्शन एक विश्लेषण

join () एक बार, concat () एक बार, join () for, + = for, concat () for

और अधिक:
अजाक्सियन >> IE में स्ट्रिंग प्रदर्शन: Array.join बनाम + = जारी रखा


9
ग्राफ के संबंध में, यदि यह स्पष्ट नहीं है; नीचा बेहतर है।
तेईकिन

1
"पहली चीजें IE7 के साथ प्रदर्शन में सुधार के साथ, हमें अब बड़े पैमाने पर स्ट्रिंग ऑपरेशन करते समय वैकल्पिक पथ का उपयोग करने पर विचार करने की आवश्यकता नहीं है। एक पुनरावृत्त स्थिति में Array.join का उपयोग करने से आपको उसी स्थिति में + = का उपयोग करने से कोई बड़ा लाभ नहीं मिलता है। इसके अलावा, IE6 के साथ मतभेद आपको उस विशिष्ट संस्करण के लिए फोर्किंग को परेशान नहीं करने की अनुमति देने के लिए थोड़े से पर्याप्त थे। "
क्रिस एस

2
@ क्रिस, यह सच नहीं है। IE7 में इन दोनों पहेलियों की तुलना करें : jsfiddle.net/9uS4n/5 (तेज) बनाम jsfiddle.net/9uS4n/2 (धीमा)। join()तकनीक का उपयोग करते हुए प्रदर्शन में कम से कम 1000 गुना सुधार प्रतीत होता है ।
किर्क वूल

अच्छी व्याख्या। कृपया इसकी भी समीक्षा करें: iliadraznin.com/2012/03/…
will824

37

हाँ यह सच है लेकिन आपको परवाह नहीं करनी चाहिए। उस के साथ जाओ जो पढ़ने में आसान हो। अगर आपको अपने ऐप को बेंचमार्क करना है, तो बाधाओं पर ध्यान दें।

मुझे लगता है कि स्ट्रिंग संघटन आपकी अड़चन नहीं होगी।


31

माइकल हरेन से सहमत ।

सरणियों के उपयोग पर भी विचार करें और प्रदर्शन में शामिल होना वास्तव में एक मुद्दा है।

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));

3
मुझे पता है कि एक सही उत्तर का चयन किया गया है, लेकिन इस उत्तर का अधिक उपयोगी उदाहरण है।
जेसन स्पर्सके

1
वाह सिर्फ वाह। IE7 में इन दोनों पहेलियों की तुलना करें : jsfiddle.net/9uS4n/5 (तेज) बनाम jsfiddle.net/9uS4n/2 (धीमा)। इस तकनीक का उपयोग करते हुए प्रदर्शन में कम से कम 1000 गुना सुधार प्रतीत होता है।
कर्क वूल

@KirkWoll: भविष्य में jsPerf का उपयोग करना चाह सकते हैं ताकि हम आसानी से परिणामों की तुलना कर सकें।
rvighne

मैं यह हाल ही में भी कर रहा हूँ, एक .NET StringBuilder के समान कोड शैली, var sb = []; sb.push ("अनुभाग 1"); sb.push ("अनुभाग 2"); रिटर्न sb.join ('');
सैम जोन्स

इस jsPerf jsperf.com/join-concat/2 में उल्लेख किया गया है: stackoverflow.com/questions/16696632/… यह इंगित करता है कि +=तेज है।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '12

18

इसे इस्तेमाल करे:

var s = ["<a href='", url, "'>click here</a>"].join("");

ठीक है, आपके द्वारा अपने उत्तर से जुड़ी पोस्ट विशेष रूप से Array.join के "मिथक" को खारिज करने की कोशिश करती है जो मेरा उत्तर बताता है। तो शायद नहीं। मैंने केवल वही पोस्ट किया है जो मैंने अभ्यास में तेज देखा है।
राहुल

स्ट्रिंग कॉनसैट की इस पद्धति से प्यार है।
bkwdesign

8

जैसे पहले से ही कुछ उपयोगकर्ताओं ने नोट किया है: यह छोटे तारों के लिए अप्रासंगिक है।

और फ़ायरफ़ॉक्स, सफारी या गूगल क्रोम में नए जावास्क्रिप्ट इंजन का अनुकूलन करते हैं

"<a href='" + url + "'>click here</a>";

जितना तेज है

["<a href='", url, "'>click here</a>"].join("");

8

जावास्क्रिप्ट में एक मूल स्ट्रिंगरफ़र ऑब्जेक्ट नहीं है, इसलिए मैं मान रहा हूं कि यह आपके द्वारा उपयोग किए जा रहे पुस्तकालय से है, या एक असामान्य होस्ट वातावरण (यानी ब्राउज़र नहीं) की एक विशेषता है।

मुझे संदेह है कि एक पुस्तकालय (जेएस में लिखा गया) कुछ भी तेजी से उत्पादन करेगा, हालांकि एक मूल स्ट्रिंगरबफ़र ऑब्जेक्ट हो सकता है। निश्चित उत्तर एक प्रोफाइलर के साथ मिल सकता है (यदि आप ब्राउज़र में चल रहे हैं तो फायरबग आपको फ़ायरफ़ॉक्स में जेएस इंजन के लिए एक प्रोफाइलर प्रदान करेगा)।


6

नुथ के शब्दों में, "समयपूर्व अनुकूलन सभी बुराई की जड़ है!" किसी भी तरह की छोटी-सी चूक से अंत में बहुत अधिक प्रभाव नहीं पड़ेगा; मैं अधिक पठनीय चुनूंगा।


1
परंपरागत रूप से स्ट्रिंगबफ़र का उपयोग संघनन से अधिक किया जाता है क्योंकि पूर्व में O (N) समय की जटिलता होती है जबकि बाद वाले O (N ^ 2) के रूप में, इस प्रकार अंतर बड़े N (लेकिन छोटे N के लिए नहीं) के लिए महत्वपूर्ण है। किसी भी स्थिति में O (N ^ 2) परिदृश्य उपयोग में पर्यावरण के आधार पर जावास्क्रिप्ट में मामला नहीं हो सकता है।
लाल रंग

4

विधि को पढ़ने में आसानी से कोड को देखते समय मनुष्यों को बोधगम्य मात्रा में बचाता है, जबकि "तेज" विधि केवल समय के लिए अगोचर और संभावित नगण्य मात्रा को बर्बाद करती है जब लोग पृष्ठ ब्राउज़ कर रहे होते हैं।

मुझे पता है कि यह पोस्ट लंगड़ी है, लेकिन मैंने गलती से कुछ पूरी तरह से अलग सोच पोस्ट कर दी थी, यह एक अलग धागा था और मुझे नहीं पता कि मैं पोस्ट कैसे हटाऊं। मेरी गलती...


3

यह का उपयोग कर बाहर जावास्क्रिप्ट प्रदर्शन रूपों एक त्वरित बेंचमार्क और चेक स्थापित करने के लिए बहुत आसान है jspref.com । जब यह सवाल पूछा गया था तब शायद वह आसपास नहीं था। लेकिन इस सवाल पर ठोकर खा रहे लोगों के लिए उन्हें साइट पर एक जैसा लेना चाहिए।

मैंने http://jsperf.com/string-concat-methods-test पर विभिन्न तरीकों की त्वरित जांच की ।


यह देखते हुए कि आजकल ऐसा लगता है कि + ऑपरेटर के साथ सहमति निश्चित रूप से जाने का रास्ता है। जब तक मैं इसे गलत पढ़ रहा हूं। जो पूरी तरह से प्रशंसनीय है।
रिचर्ड

2

मुझे कार्यात्मक शैली का उपयोग करना पसंद है, जैसे:

function href(url,txt) {
  return "<a href='" +url+ "'>" +txt+ "</a>"
}

function li(txt) {
  return "<li>" +txt+ "</li>"
}

function ul(arr) {
  return "<ul>" + arr.map(li).join("") + "</ul>"
}

document.write(
  ul(
    [
      href("http://url1","link1"),
      href("http://url2","link2"),
      href("http://url3","link3")
    ]
  )
)

यह शैली पठनीय और पारदर्शी लगती है। यह उपयोगिताओं के निर्माण की ओर जाता है जो कोड में पुनरावृत्ति को कम करता है।

यह भी स्वचालित रूप से मध्यवर्ती तार का उपयोग करने के लिए जाता है।


1

जहां तक ​​मुझे पता है, हर कॉन्फिडेंस का मतलब एक मेमोरी रीअलोकेशन है। तो समस्या यह करने के लिए उपयोग किए जाने वाले ऑपरेटर की नहीं है, समाधान है कि संघों की संख्या को कम किया जाए। उदाहरण के लिए, जब आप कर सकते हैं, तो पुनरावृति संरचनाओं के बाहर संघनन करें।


यह वास्तव में बुरी सलाह नहीं है, मुझे नहीं पता कि यह इतना नीचे क्यों वोट दिया गया है। मुझे पता है कि यह विशिष्ट प्रश्न का उत्तर नहीं देता है, लेकिन यह आम तौर पर अच्छी सलाह के रूप में मान्यता के योग्य है।
आंखों की रोशनी

0

हाँ, सामान्य मानदंड के अनुसार। उदा: http://mckoss.com/jscript/SpeedTrial.htm

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

आप बेहतर डोम हेरफेर देखना होगा।


लिंक मर चुका है .. https://web.archive.org/web/20150912072015/http://mckoss.com/jscript/SpeedTrial.htm वेब आर्काइव संस्करण के लिए अंक।
टोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.