2008-09-30 12 views
7

मुझे जावास्क्रिप्ट में स्ट्रिंग्स का एक गुच्छा जोड़ना है और ऐसा करने का सबसे तेज़ तरीका खोजना है। आइए मान लें कि जावास्क्रिप्ट को एक बड़ी एक्सएमएल- "फाइल" बनाना है, स्वाभाविक रूप से, कई छोटे स्ट्रिंग्स होते हैं। इसलिए मैं के साथ आया था:इस उदाहरण से जावास्क्रिप्ट स्ट्रिंग concatenation तेजी से?

var sbuffer = []; 
    for (var idx=0; idx<10000; idx=idx+1) { 
     sbuffer.push(‘<xmltag>Data comes here... bla... </xmltag>’); 
    } 
    // Now we "send" it to the browser... 
    alert(sbuffer.join(”)); 

पाश या अन्य "परिष्कृत" कोड है जो उदाहरण बनाता है के लिए किसी भी ध्यान देना नहीं है।

मेरा प्रश्न है: स्ट्रिंग्स के एक अज्ञात संख्या के लिए, आप एक तेजी से एल्गोरिथ्म/विधि/विचार एक बहुत बड़ा एक के लिए कई छोटे तार जोड़ करना है?

उत्तर

13

लाइन बदलने:

sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;

को

sbuffer.push(‘Data comes here... bla... ’);

आप 5-50% गति लाभ दे देंगे (ब्राउज़र के आधार, IE में - लाभ उच्चतम हो जाएगा)

सम्मान।

+1

क्या आपके पास इसके आंकड़ों के लिए कोई स्रोत है? मैं प्रत्येक पुनरावृत्ति (या तो पुश, या सरणी। लम्बाई में) की लंबाई की जांच करने के लिए जुर्माना लगाता। मुझे निश्चित रूप से पता है कि आईई की स्ट्रिंग कॉन्सटेनेशन की गति हालांकि वांछित होने के लिए बहुत अधिक छोड़ देती है। – scunliffe

1

मुझे लगता है कि आप इष्टतम के करीब हैं। वाईएमएमवी, होस्ट प्रक्रिया (जैसे ब्राउज़र) के जावास्क्रिप्ट इंजन के भीतर गति का एक बड़ा सौदा प्राप्त या खो जाता है।

+0

यूप, वास्तव में जावास्क्रिप्ट "प्रदर्शन" का कई क्लाइंट मशीनों पर चलाने का बड़ा फायदा होता है न कि केवल एक सर्वर पर - divide et impere ;-)। लेकिन क्लाइंट-स्क्रिप्टिंग अधिक जटिल हो रही है, प्रदर्शन भी एक मुद्दा है। प्रश्न: वाईएमएमवी का क्या अर्थ है? – Georgi

+0

आपका माइलेज मई वेरी –

+0

@ जॉर्जियो: आपका माइलेज मई वेरी –

15

सवाल JavaScript string concatenation एक स्वीकृत जवाब यह है कि एक very good comparison of JavaScript string concatenation performance से लिंक होता है।

संपादित करें: मैंने सोचा होगा कि आप डफ के डिवाइस का उपयोग करके थोड़ा अधिक प्रदर्शन कर सकते हैं जैसा लेख बताता है।

+0

हैलो सैम, मैंने पहले उस पोस्ट को देखा लेकिन मेरा प्रश्न व्यवहार में थोड़ा अलग है कि मैं वास्तव में पूछ रहा हूं कि किसी के पास तेज समाधान है या नहीं, न केवल संयम बनाम तुलना करने की कोशिश करें। कौन जानता है? शायद वहां एक और समाधान है जो विशाल स्ट्रिंग्स के लिए तेज़ है। – Georgi

+0

अद्भुत लिंक, धन्यवाद! –

1

मुझे लगता है कि एक सरणी पर तार धक्का और फिर सरणी में शामिल होने के लिए जावास्क्रिप्ट में स्ट्रिंग संयोजन के लिए सबसे तेजी से तकनीक है। इस discussion about W3C DOM vs. innerHTML में कुछ सहायक सबूत हैं। आंतरिक HTML 1 और आंतरिक HTML 2 परिणामों के बीच अंतर देखें।

1

जहाँ तक मुझे पता है, आपका एल्गोरिदम अच्छा है और स्ट्रिंग कॉन्सटेनेशन समस्या के लिए एक निष्पादक समाधान के रूप में जाना जाता है।

0

आईई खराब कचरा कलेक्टर से सावधान रहें! उपयोग करने के बाद आप अपने सरणी के साथ क्या करना चाहते हैं? शायद यह जीसी'd मिलेगा?

आप जुड़ जाता है के साथ श्रृंखलाबद्ध पर perfornace हासिल कर सकते हैं, और फिर बाद GC'ing पर खो देते हैं। दूसरी ओर यदि आप हर समय गुंजाइश में एक सरणी छोड़ते हैं, और इसका पुन: उपयोग नहीं करते हैं, तो यह एक अच्छा समाधान हो सकता है।

व्यक्तिगत रूप से मैं सबसे सरल समाधान चाहता हूं: बस + = ऑपरेटर का उपयोग करने के लिए।

+0

मुझे आश्चर्य है कि मेरे उत्तर में क्या गलत है ?! – Thevs

0

आपको buffering द्वारा थोड़ी अधिक गति मिल सकती है।

+0

क्षमा करें यह मदद नहीं करता है क्योंकि स्ट्रिंग्स को समेकित करने की संख्या ज्ञात नहीं है ("स्ट्रिंग्स की अज्ञात संख्या के लिए ...")। मैंने भी बफरिंग के बारे में सोचा, लेकिन यह मेमोरी पदचिह्न और कचरा संग्रह में भारी वृद्धि करेगा। – Georgi

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