2011-09-04 27 views
50

Hangi yöntem daha hızlıdır?Array Join Dizisi String Concat

Dizisi Üyelik:

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(""); 

Dize 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

Ne istediğinize bağlı. String yöntemi biraz daha basittir. Dizi katılım yolu biraz daha hızlı olabilir (jsperf.com üzerinde test edebilirsiniz). – andrewmu

+0

Tam olarak ne için döngü nedir? Sadece kopyalama veya içinde işlem yapıyorsunuz. Bir diziyi kopyalamanın daha hızlı yolları vardır. – epascarello

+0

epascarello, bu iki yöntemi test etmek için sadece aptalca örneklerdir – ajax333221

cevap

34

Dize birleştirme ECMAScript'te daha hızlıdır. İşte size göstermek için oluşturulan bir kriter var: dizi katılmak ama görünüşe bu modern JavaScript motorları için doğru değildir ardından this Google document titled 'Optimizing JavaScript code' dize concat göre

http://jsben.ch/#/OJ3vo

+0

Safari, boyun ve boynunun olduğu tek tarayıcı gibi görünüyor. – AlienWebguy

+0

dikişli 20 alfabe ve bu kriter tutarlı kalıyor. – AlienWebguy

+0

Ayrıca zıt düşündüm ama başka bir örnek http://jsperf.com/join-concat/2 buldum. Neden? Dize ECMAScript’te değişmez mi? –

8

Kesinlikle kullanarak Array.join() daha hızlı olduğunu söyleyebiliriz. Birkaç parça JavaScript kodu üzerinde çalıştım ve diziler lehine string manipülasyonunu kaldırarak performansı önemli ölçüde artırdım.

+2

En son testler bunu desteklemektedir: https://github.com/nodejs/node/issues/6610 –

2

yavaştır.

Belgede kullandıkları a benchmark for the Fibonacci test example yaptım ve dizenin bitiştirilmesi (yapıştırma), Arrayjoin'u kullanmanın hemen hemen 4x kadar olduğunu gösteriyor.

2011 yılından itibaren modern güne
+1

Sadece birleştirme ile dize birleştirme karşılaştırmak değil gibi kriter çok iyi değil Bir dizi ancak katılma durumunda da referans noktasında yeni bir dizi oluşturun. – dpr

6

...

dize birleştirme kullanarak aşağıdaki join yeniden yazma bakın ve ne kadar yavaş standart uygulanması aşıyor.

// 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; 
} 

ahlaki - her zaman, elle dizeleri bitiştirmek standart join kullanmayın.

+2

Bu konuya rastladım ve diğer cevaplar belki 2011'de doğrudur, ancak şu anda bu katılım gerçekten daha iyi. – Cageman

-1

üç ardışık nokta (...) ile yazılı yayılmış operatörü, ES6 yeni ve size birden fazla unsurları içine genişleme yeteneğine veya yayılmasını, iterable nesne verir.

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

Baskı: İki Şehirlerde Wonderland Öyküsü Don Kişot Hobbit Alice

+1

Bu işlev yalnızca işleviniz çoklu ('... 'rest') bağımsız değişkenleri kabul ediyorsa çalışır. 'console.log' böyle bir örnektir. Ancak, bu her zaman OP'nin sorusunu yanıtlamaz, çünkü yalnızca 1 string parametresini kabul eden bir işlev kullanıyor olabilirsiniz, bu durumda yayılan operatör başarısız olur. – chharvey

0

El birleştirme sabit uzunlukta bir sayısal dizi için, daha hızlıdır.

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' 

`

Sonuçlar: Krom 64.0.3282.186 kullanarak, Array.join% 46 daha yavaştır.