JavaScript文字列接続性能問題


w 3 schoolのECMAScript定義類または対象には、Javascriptにおける文字列接続の性能問題を説明する例が挙げられている.
 
ECMAScriptで最も一般的な問題は文字列接続の性能です.他の言語と似ていますが、ECMAScriptの文字列は可変ではありません.つまり、その値は変えられません.下記のコードを考慮してください.
var str = "hello ";
str += "world";
実際、このコードは舞台裏で実行されるステップは以下の通りです.
  • は、「ハロー」を格納する文字列を作成する.
  • は、「world」を格納する文字列を作成する.
  • は、接続結果を格納する文字列を作成する.
  • は、strの現在のコンテンツを結果にコピーする.
  • は結果に「world」をコピーします.
  • は、結果を指すようにstrを更新する.
  • 文字列接続が完了するたびに、ステップ2〜6が実行され、このような動作はリソースを非常に消費する.このプロセスを何百回も繰り返すと、何千回も性能に問題が生じます.解決策は、Arayオブジェクトで文字列を格納し、join()メソッド(パラメータが空の文字列)で最後の文字列を作成します.想像は前のコードの代わりに下のコードを使います.
    var arr = new Array();
    arr[0] = "hello ";
    arr[1] = "world";
    var str = arr.join("");
    
    このように、配列中にどれだけの文字列を導入しても問題になりません.ジョイン()メソッドを呼び出した時だけ接続動作が発生します.このとき実行するステップは以下の通りです.
  • は、結果を格納する文字列
  • を作成する.
  • は、各文字列を結果の適切な位置にコピーする
  • .
    次にコード例を挙げて性能を説明した.
     
    function StringBuffer () {
      this._strings_ = new Array();
    }
    
    StringBuffer.prototype.append = function(str) {
      this._strings_.push(str);
    };
    
    StringBuffer.prototype.toString = function() {
      return this._strings_.join("");
    };
    
    var d1 = new Date();
    var str = "";
    for (var i=0; i < 100000; i++) {
        str += "text";
    }
    var d2 = new Date();
    
    console.log(d2.getTime() - d1.getTime());
    
    var buffer = new StringBuffer();
    d1 = new Date();
    for (var i=0; i < 100000; i++) {
        buffer.append("text");
    }
    var result = buffer.toString();
    d2 = new Date();
    
    console.log(d2.getTime() - d1.getTime());
    
     私のマシンの結果は
    75
    125
    直接連結の性能は配列の使用よりも優れています.作成対象も多くの時間がかかります.
    いらっしゃいませ.