जावास्क्रिप्ट में तार को जोड़ने का सबसे कुशल तरीका?


163

जावास्क्रिप्ट में, मेरे पास एक लूप है जिसमें कई पुनरावृत्तियां हैं, और प्रत्येक पुनरावृत्ति में, मैं कई +=ऑपरेटरों के साथ एक विशाल स्ट्रिंग बना रहा हूं । क्या एक स्ट्रिंग बनाने का एक अधिक कुशल तरीका है? मैं एक गतिशील सरणी बनाने के बारे में सोच रहा था जहाँ मैं इसमें तार जोड़ता रहूँ और फिर जुड़ जाऊँ। क्या कोई समझा सकता है और ऐसा करने का सबसे तेज़ तरीका का उदाहरण दे सकता है?


2
क्या आप स्ट्रिंग के लिए उपयोग कर रहे हैं? इस पर कोई भी प्रदर्शन युक्तियाँ आपके वातावरण, आपके तार के आकार, एक विशेष js इंजन के अलग-अलग संचालन आदि के अनुकूलन के आधार पर अलग-अलग हो सकती हैं
बेन मैककॉर्मिक


5
इस लिंक को देखें jsperf.com/join-concat/2
rab

मैं IE9 का उपयोग कर रहा हूं, लेकिन IE8 संगतता मोड में (जो मैं बदल नहीं सकता)। विशाल स्ट्रिंग कुछ ऐसा है जिसे मैं jquery का उपयोग करके DOM में सम्मिलित करूंगा।
ओमेगा

जवाबों:


135

JSPerf में बेंचमार्क पर आधारित लगता है कि उपयोग +=करना सबसे तेज़ तरीका है, हालाँकि यह आवश्यक नहीं है कि हर ब्राउज़र में हो।

DOM में स्ट्रिंग्स के निर्माण के लिए, यह स्ट्रिंग को पहले से बेहतर बनाना और फिर DOM में जोड़ना बेहतर प्रतीत होता है , बल्कि इसके बाद पुन: इसे डोम में जोड़ें। हालांकि आपको अपने स्वयं के मामले को बेंचमार्क करना चाहिए।

(सुधार के लिए धन्यवाद @zAlbee)


1
लिंक्ड पेज में देखें। ऐसा लगता है कि +=किसी सरणी में शामिल होने और करने के बीच बहुत कम अंतर है ।
याकूब हैम्पल

ऐसा लगता है कि इसे हर स्ट्रिंग के लिए DOM में जोड़ा जा रहा है 66%(IE9 के लिए) तेजी से इसे स्ट्रिंग बनाने और फिर स्ट्रिंग को DOM में जोड़ने से।
ओमेगा

जुड़ा हुआ पृष्ठ दोनों परीक्षणों के लिए + = का उपयोग करता है, न .join () दृष्टि में, इसलिए यह एक व्यर्थ परीक्षण है जो केवल शोर को किसी "अंतर" के रूप में दिखाता है। शोर js हालांकि कैसे हो सकता है का अच्छा उदाहरण ... डोम स्ट्रिंग की तुलना में धीमा है, इसलिए इसे संयम से उपयोग करें।
डंडाविस

समय है, लेकिन एक घटक है। पुनरावृत्ति दिनचर्या के लिए, मुझे आश्चर्य है कि जीसी का विभिन्न तरीकों के बीच क्या प्रभाव है?
डेविड ब्रैडली

बड़े तार के लिए, array.join, स्ट्रिंग कॉनैट की बहुत अप्रिय मेमोरी बग bugs.chromium.org/p/v8/issues/detail?id=3175
mwag

70

मैं स्वयं इस पर कोई टिप्पणी नहीं करता, लेकिन मैं @Jakub Hampl के सुझाव को इंगित करना चाहता हूं:

DOM में स्ट्रिंग्स के निर्माण के लिए, कुछ मामलों में यह बेहतर हो सकता है कि इसे DOM में जोड़ना बेहतर हो, बल्कि इसके बाद एक बार एक बड़ा स्ट्रिंग जोड़ें।

गलत है, क्योंकि यह एक त्रुटिपूर्ण परीक्षण पर आधारित है। यह परीक्षण वास्तव में कभी भी DOM में शामिल नहीं होता है।

यह निश्चित परीक्षण से पता चलता है कि इसे प्रस्तुत करने से पहले एक बार में स्ट्रिंग बनाने से बहुत कुछ होता है, बहुत तेजी से। यह एक प्रतियोगिता भी नहीं है।

(क्षमा करें यह एक अलग उत्तर है, लेकिन मेरे पास अभी तक उत्तरों पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है।)


4
मुझे लगता है कि यह अपने आप में एक उत्तर होने के लायक है क्योंकि इसमें एक परीक्षण और एक निष्कर्ष होता है (हालांकि परीक्षण किसी अन्य उत्तर पर आधारित / प्रेरित होता है, यह ठीक होना चाहिए), खेद की कोई आवश्यकता नहीं है।
user202729

14

तीन साल पहले इस सवाल का जवाब दिया गया था, लेकिन मैं अपना जवाब किसी भी तरह प्रदान करूंगा :)

दरअसल, स्वीकृत उत्तर पूरी तरह से सही नहीं है। जैकब का परीक्षण हार्डकोडेड स्ट्रिंग का उपयोग करता है जो जेएस इंजन को कोड निष्पादन का अनुकूलन करने की अनुमति देता है (इस सामान में Google का V8 वास्तव में अच्छा है!)। लेकिन जैसे ही आप पूरी तरह से बेतरतीब तारों का उपयोग करते हैं ( यहां जेएसपीआरएफ है ) तो स्ट्रिंग का संघटन दूसरे स्थान पर होगा।


दिलचस्प है कि मेरी विंडोज मशीन पर क्रोम 54 और फ़ायरफ़ॉक्स 45 के साथ, कॉन्कैट आपके संस्करण का उपयोग करते हुए अन्य दो की तुलना में दोगुना से अधिक है। IE 11 में अन्य तीन ब्राउज़रों में नॉन-कॉनसैट के रूप में तीनों धीमे हैं।
शॉनफुमो 18

4
यह संस्करण से संस्करण में भिन्न है। मुझे लगता है, अभी Chrome के VM में इस मामले के लिए कुछ पूर्व-अनुकूलन हो सकते हैं। मैंने क्रोम v53 पर फिर से परीक्षण किया और कॉन्सेप्टन अब सबसे तेज़ समाधान है: डी सेम हार्डवेयर लेकिन विभिन्न क्रोम संस्करण बिल्कुल अलग परिणाम देते हैं।
वलोडिमिर उसार्स्की

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.