2011-09-04 11 views
50

कौन सी विधि तेज है?ऐरे बनाम स्ट्रिंग कंसट

सरणी में शामिल हों:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
var myarray = str_to_split.split(","); 

var output=myarray.join(""); 

स्ट्रिंग Concat:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
var myarray = str_to_split.split(","); 

var output = ""; 
for (var i = 0, len = myarray.length; i<len; i++){ 
    output += myarray[i]; 
} 
+0

जो आप चाहते हैं उस पर निर्भर करता है। स्ट्रिंग विधि थोड़ा आसान है। ऐरे शामिल हो सकता है थोड़ा तेज़ हो सकता है (आप jsperf.com पर परीक्षण कर सकते हैं)। – andrewmu

+0

बिल्कुल लूप के लिए क्या है? बस कॉपी या आप इसमें प्रसंस्करण कर रहे हैं। सरणी की प्रतिलिपि बनाने के तेज़ तरीके हैं। – epascarello

+0

epascarello, वे इन 2 विधियों का परीक्षण करने के लिए केवल मूर्ख उदाहरण हैं – ajax333221

उत्तर

34

ईसीएमएस्क्रिप्ट में स्ट्रिंग कॉन्सटेनेशन तेज है। यहाँ एक बेंचमार्क मैं तुम्हें दिखाने के लिए बनाया गया है: तो सरणी में शामिल होने लेकिन जाहिरा तौर पर इस आधुनिक जावास्क्रिप्ट इंजन के लिए सच नहीं है

http://jsben.ch/#/OJ3vo

+0

सफारी एकमात्र ब्राउज़र प्रतीत होता है जहां वे गर्दन और गर्दन हैं। – AlienWebguy

+0

सिलाई 20 वर्णमाला और यह बेंचमार्क लगातार बना हुआ है। – AlienWebguy

+0

मैंने भी विपरीत रूप से सोचा लेकिन मुझे एक और उदाहरण http://jsperf.com/join-concat/2 मिला। ऐसा क्यों है? ECMAScript में स्ट्रिंग अपरिवर्तनीय नहीं है? –

8

मैं निश्चित रूप से कह सकते हैं कि Array.join का उपयोग कर() तेजी से होता है। मैंने जावास्क्रिप्ट कोड के कुछ टुकड़ों पर काम किया है और सरणी के पक्ष में स्ट्रिंग मैनिपुलेशन को हटाकर महत्वपूर्ण प्रदर्शन किया है।

+2

नवीनतम परीक्षण इस पर वापस आते हैं: https://github.com/nodejs/node/issues/6610 –

2

this Google document titled 'Optimizing JavaScript code' स्ट्रिंग concat के अनुसार धीमी है।

मैंने a benchmark for the Fibonacci test example बनाया है जो उन्होंने दस्तावेज़ में उपयोग किया था और यह दिखाता है कि Arrayjoin का उपयोग करते हुए स्ट्रिंग को लगभग 4x तेज है।

+1

बेंचमार्क बहुत अच्छा नहीं है क्योंकि आप न केवल स्ट्रिंग कॉन्सटेनेशन की तुलना में शामिल होते हैं एक सरणी लेकिन जॉइन-केस में बेंचमार्क में भी एक नई सरणी बनाते हैं। – dpr

6

2011 से और आधुनिक दिन में ...

स्ट्रिंग संयोजन का उपयोग कर निम्नलिखित join पुनर्लेखन देखें, और कितना धीमी यह मानक कार्यान्वयन की तुलना में है।

// Number of times the standard `join` is faster, by Node.js versions: 
// 0.10.44: ~2.0 
// 0.11.16: ~4.6 
// 0.12.13: ~4.7 
// 4.4.4: ~4.66 
// 5.11.0: ~4.75 
// 6.1.0: Negative ~1.2 (something is wrong with 6.x at the moment) 
function join(sep) { 
    var res = ''; 
    if (this.length) { 
     res += this[0]; 
     for (var i = 1; i < this.length; i++) { 
      res += sep + this[i]; 
     } 
    } 
    return res; 
} 

नैतिक है - मैन्युअल रूप से तार जोड़ नहीं है, हमेशा मानक join का उपयोग करें।

+2

मैं इस विषय पर आया, और अन्य उत्तरों शायद 2011 में सही हैं, लेकिन इस समय में शामिल होना वास्तव में बेहतर है। – Cageman

-1

प्रसार ऑपरेटर लगातार तीन डॉट्स (...) के साथ लिखा, ES6 में नया है और आप का विस्तार करने की क्षमता है, या प्रसार, कई तत्वों में iterable वस्तुओं देता है।

const books = ["Don Quixote", "The Hobbit", "Alice in Wonderland", "Tale of Two Cities"]; 
 
console.log(...books);

प्रिंटों: दो शहरों की वंडरलैंड कथा में डॉन क्विक्सोट The Hobbit ऐलिस

+1

यह केवल तभी काम करता है जब आपका फ़ंक्शन एकाधिक ('... rest') तर्क स्वीकार करता है। 'console.log' ऐसा उदाहरण है। हालांकि, यह हमेशा ओपी के प्रश्न का उत्तर नहीं देता है क्योंकि आप ऐसे फ़ंक्शन का उपयोग कर रहे हैं जो केवल 1 स्ट्रिंग पैरामीटर स्वीकार करता है, जिस स्थिति में स्प्रेड ऑपरेटर विफल हो जाएगा। – chharvey

0

मैनुअल संयोजन निश्चित लंबाई की एक संख्यात्मक सरणी के लिए, तेजी से होता है।

Here's a JSPerf test that tests these two operations:

zxy.join('/') 

// versus 

zxy[0] + '/' + zxy[1] + '/' + zxy[2] 

// given the array 

zxy = [1, 2, 3] 

// resulting in the string '0/1/2' 

`` `

परिणाम: क्रोम 64.0.3282.186 का उपयोग करना, Array.join 46% धीमी थी।

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