2011-09-04 15 views
50

どの方法が高速ですか?配列結合対文字列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=myarray.join(""); 

文字列の連結方式:

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

あなたが望むものによって異なります。 Stringメソッドは少しシンプルです。配列の結合方法は少し速いかもしれません(jsperf.comでテストできます)。 – andrewmu

+0

forループは正確に何ですか?ちょうどコピーするか、あなたはそれで処理していますか?配列をコピーするより高速な方法があります。 – epascarello

+0

epascarello、これらの2つのメソッドをテストするのは馬鹿げた例です。 – ajax333221

答えて

34

ECMAScriptでは文字列の連結が高速です。ここで私はあなたを表示するために作成したベンチマークです:this Google document titled 'Optimizing JavaScript code'文字列の連結による

http://jsben.ch/#/OJ3vo

+0

サファリは首と首の唯一のブラウザだそうです。 – AlienWebguy

+0

は20文字のアルファベットをステッチしており、ベンチマークは一貫しています。 – AlienWebguy

+0

私はまた反対に考えましたが、私は別の例http://jsperf.com/join-concat/2を見つけました。何故ですか? ECMAScriptでは文字列が不変ではありませんか? –

8

私は間違いなくArray.joinを(使用していると言うことができます)高速です。私はいくつかのJavaScriptコードで作業し、配列を優先して文字列操作を取り除いてパフォーマンスを大幅に向上させました。

+2

最新のテストではこれをバックアップしています:https://github.com/nodejs/node/issues/6610 –

2

は参加配列より遅いですが、どうやらこれは、現代のJavaScriptエンジンには当てはまりません。

私はa benchmark for the Fibonacci test exampleを文書で使用しました。これは、文字列の連結(接着)がArrayjoinを使用した場合とほぼ同じくらい速いことを示しています。

+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の新機能で、あなたに複数の要素に拡大する能力、または広がり、反復可能なオブジェクトを提供します。

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

プリント:二つの都市の不思議物語でドンキホーテザホビットアリス

+1

これはあなたの関数が複数の( '... rest')引数を受け入れる場合にのみ機能します。 'console.log'はそのような例です。しかし、これはOPの質問に常に答えるわけではありません。なぜなら、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%遅かったです。