JavaScript文字列接続性能問題
1968 ワード
w 3 schoolのECMAScript定義類または対象には、Javascriptにおける文字列接続の性能問題を説明する例が挙げられている.
ECMAScriptで最も一般的な問題は文字列接続の性能です.他の言語と似ていますが、ECMAScriptの文字列は可変ではありません.つまり、その値は変えられません.下記のコードを考慮してください.は、「ハロー」を格納する文字列を作成する. は、「world」を格納する文字列を作成する. は、接続結果を格納する文字列を作成する. は、strの現在のコンテンツを結果にコピーする. は結果に「world」をコピーします. は、結果を指すようにstrを更新する. 文字列接続が完了するたびに、ステップ2〜6が実行され、このような動作はリソースを非常に消費する.このプロセスを何百回も繰り返すと、何千回も性能に問題が生じます.解決策は、Arayオブジェクトで文字列を格納し、join()メソッド(パラメータが空の文字列)で最後の文字列を作成します.想像は前のコードの代わりに下のコードを使います.は、結果を格納する文字列 を作成する.は、各文字列を結果の適切な位置にコピーする .
次にコード例を挙げて性能を説明した.
75
125
直接連結の性能は配列の使用よりも優れています.作成対象も多くの時間がかかります.
いらっしゃいませ.
ECMAScriptで最も一般的な問題は文字列接続の性能です.他の言語と似ていますが、ECMAScriptの文字列は可変ではありません.つまり、その値は変えられません.下記のコードを考慮してください.
var str = "hello ";
str += "world";
実際、このコードは舞台裏で実行されるステップは以下の通りです.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
直接連結の性能は配列の使用よりも優れています.作成対象も多くの時間がかかります.
いらっしゃいませ.