該当場所を見つける度に関数のオーバーヘッドが掛かる訳ですから、テスト文字列によってパフォーマンスが著しく変わるハズではないかと。
以下参考に致しました。
「escapeHTML の実装 3 パターン (ベンチマーク付き)」
http://d.hatena.ne.jp/reinyannyan/20060711/
「激しく誤差の範囲内の予感」
http://d.hatena.ne.jp/f99aq/20060714/
ということでやってみた結果、それほど置換数が多くなくても ie に限ると10倍以上の差がでるようです。ff と op は有意義な差が無いです。
告白すると、replace で正規表現使ったり、関数を渡したりする事ができるなんて・・・。知りませんでした。
おいおい大丈夫かよってなもんで。
「問題なければすべて良し」的な対応をしてきた自分に激しく反省。これからもポロポロ垢が出てくるんだろーなぁ。
おいおい大丈夫かよってなもんで。
「問題なければすべて良し」的な対応をしてきた自分に激しく反省。これからもポロポロ垢が出てくるんだろーなぁ。
以下。テスト内容
テスト
対象文字列はおよそ 3k。置換文字数は各々 110 個程度です。
テストはこちら
firefox だと途中でうっざいダイアログが出ますので、何回か試行が要るかも。
■ 結果
ie7.0
multi replace: 63
single replace: 1000
ie6.0
multi replace: 47:
single replace: 812:
ff1.5
multi replace: 2250
single replace: 2500
op8.53
multi replace: 2750
single replace: 2141
ns7.1
multi replace: 203
single replace: 1000
なんで?ってな結果です。ns の結果が大体予想していた感じに近かったんですが、ie の速さは異常だし op に至っては関数を与えた方が速くなってる。
いままで op は色んなところで意外な結果を出してましたんで、おそらくパフォーマンスを上げる何らかの処理がなされているんだろうとは思いますが、今回はあまり成果が出ていません。ie のが圧倒的。
テスト用コード
var regex = new RegExp('[&"<>]', "g");
var escapeRules = {"&" : "&", '"' : """, "<" : "<", ">" : ">"};
// 単純に列挙
function escapeHTML_replace_multi(s) {
return s.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
}
// 関数を渡してやる(キャッシュ付)
function escapeHTML_replace_func_rulescached(s) {
return s.replace(regex, function(c){
return escapeRules[c];
});
}
// テスター
(function() {
function test(f) {
var tm = (new Date()).getTime();
for(var i = 0; i < 100; i++){
f(str);
}
return ((new Date()).getTime() - tm) + ":" + "<br>";
}
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
})();
var escapeRules = {"&" : "&", '"' : """, "<" : "<", ">" : ">"};
// 単純に列挙
function escapeHTML_replace_multi(s) {
return s.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
}
// 関数を渡してやる(キャッシュ付)
function escapeHTML_replace_func_rulescached(s) {
return s.replace(regex, function(c){
return escapeRules[c];
});
}
// テスター
(function() {
function test(f) {
var tm = (new Date()).getTime();
for(var i = 0; i < 100; i++){
f(str);
}
return ((new Date()).getTime() - tm) + ":" + "<br>";
}
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
document.write("multi replace: ", test(escapeHTML_replace_multi));
document.write("single replace: ", test(escapeHTML_replace_func_rulescached));
})();
うーん。問題ないよなぁ。結果が意外すぎる・・・。
テスト用の文字列 (str)は、テストを参照ください。
この記事へのコメント