JS文字列接続性能
3924 ワード
W 3 SCHOOLにおいて、js文字列接続方法の性能比較を議論するページがあります.
対象に興味があるのは、問題を解決する方法を使うことです.ECMAScriptで最も一般的な問題は文字列接続の性能です.他の言語と似ていますが、ECMAScriptの文字列は可変ではありません.つまり、その値は変えられません.下記のコードを考慮してください.は、「ハロー」を格納する文字列を作成する. は、「world」を格納する文字列を作成する. は、接続結果を格納する文字列を作成する. は、strの現在のコンテンツを結果にコピーする. は結果に「world」をコピーします. は、結果を指すようにstrを更新する. 文字列接続が完了するたびに、ステップ2〜6が実行され、このような動作はリソースを非常に消費する.このプロセスを何百回も繰り返すと、何千回も性能に問題が生じます.解決策は、Arayオブジェクトで文字列を格納し、join()メソッド(パラメータが空の文字列)で最後の文字列を作成します.想像は前のコードの代わりに下のコードを使います.は、結果を格納する文字列 を作成する.は、各文字列を結果の適切な位置にコピーする .
この解決策はいいですが、もっといい方法があります.問題は、このコードは正確にその意図を反映することができません.より分かりやすくするためには、この機能をStringBuffer類で包装することができます.
対象に興味があるのは、問題を解決する方法を使うことです.ECMAScriptで最も一般的な問題は文字列接続の性能です.他の言語と似ていますが、ECMAScriptの文字列は可変ではありません.つまり、その値は変えられません.下記のコードを考慮してください.
var str = "hello ";
str += "world";
実際、このコードは舞台裏で実行されるステップは以下の通りです.var arr = new Array();
arr[0] = "hello ";
arr[1] = "world";
var str = arr.join("");
このように、配列中にどれだけの文字列を導入しても問題になりません.ジョイン()メソッドを呼び出した時だけ接続動作が発生します.このとき実行するステップは以下の通りです.この解決策はいいですが、もっといい方法があります.問題は、このコードは正確にその意図を反映することができません.より分かりやすくするためには、この機能をStringBuffer類で包装することができます.
function StringBuffer () {
this._strings_ = new Array();
}
StringBuffer.prototype.append = function(str) {
this._strings_.push(str);
};
StringBuffer.prototype.toString = function() {
return this._strings_.join("");
};
このコードはまず注意しなければならないのはstrigs属性で、本来は私有属性です.それは二つの方法しかありません.つまり、apped()とtoString()の方法です.apped()メソッドは、文字列配列にパラメータを付加し、toString()メソッドは配列のjinメソッドを呼び出して、本当に接続された文字列を返します.StringBufferオブジェクトを使って文字列のセットを接続するには、次のコードが使えます.var buffer = new StringBuffer ();
buffer.append("hello ");
buffer.append("world");
var result = buffer.toString();
StringBuffer :
var d1 = new Date();
var str = "";
for (var i=0; i < 10000; i++) {
str += "text";
}
var d2 = new Date();
document.write("Concatenation with plus: "
+ (d2.getTime() - d1.getTime()) + " milliseconds");
var buffer = new StringBuffer();
d1 = new Date();
for (var i=0; i < 10000; i++) {
buffer.append("text");
}
var result = buffer.toString();
d2 = new Date();
document.write("<br />Concatenation with StringBuffer: "
+ (d2.getTime() - d1.getTime()) + " milliseconds");
このコードは に して つのテストを います. はプラス を い、 つ はStringBuffer を います. は10000 に されています. d 1とd 2は、 に する を するために される.Dateオブジェクトを する 、パラメータがない 、オブジェクトに するのは の と です. にどれぐらいの がかかったかを するには、 のミリ を(getTime()メソッドの り で すればいいです.これはJavaScriptの を する な です.このテストの は、SteringBufferクラス を してプラス を すると50%から66%の が されるということを すべきである.
が のIE 8で をしましたが、 10 は を りました.
Concatension with plus: 23.5 miliseconds Concation with StringBuffer:42 miliseconds
を10 した 、
Concatension with plus: 145.5 milisecondsContation with StringBuffer: 282.8 miliseconds
IE 8は くから + を したように えますが、ここでは をカスタマイズされたSteringBuffer にパッケージ し、その を び して をしていますが、 の はどうですか? のコードを します.
var buffer=new Aray()d 1=new Date();for(var i=0;i<10000;i+){ buffer[i]=“text”;var reult=buffer.jun(");d 2=new Date();
document.write(\
Concatension with StrigBurer:) + (d 2.getTime()-d 1.getTime()+「miliseconds」) は の りです
Concatension with plus: 23.4 miliseconds Concation with StringBuffer:17.3 miliseconds
を10 した 、
Concatension with plus: 126.4 milisecondsContation with StringBuffer: 98.5 miliseconds
の から ても、IE 8の の はやはり に を ったことがないようです. たところ、コール の も れないです.また、この から れば、 にいくつかの を する 、 にテストしなければならないです. の はいつも れです.
この をする で、インターネットで を しました.Heeroの「Javascript の の について」には、IEの バージョンのブラウザと のブラウザで った が されています.ブラウザの は えず しています.フロントエンドエンジニアとして、Javascriptプログラムの を に して、 な を します.