激しく誤差の範囲内の予感
追記
safari だと replace に関数を渡せないらしいです。
replace に関数指定しない方が良いよ
escapeHTML をぐるぐる回してみた
俺のあれは数年前から停滞してるので、かっこいい人の登場を待ちます。。。
関数そのまま使いましたm(__)m 眠い。
escapeHTML の実装 3 パターン (ベンチマーク付き) - (new Hatena).blog()
window.onload = function ()
{
bench(escapeHTML_replace_multi, "replace_multi");
bench(escapeHTML_replace_func_rulescached_regexcached, "replace_func_rulescached_regexcached");
bench(escapeHTML_replace_func_rulescached, "replace_func_rulescached");
bench(escapeHTML_replace_func_regexcached, "replace_func_regexcached");
bench(escapeHTML_replace_func, "replace_func");
bench(escapeHTML_innerHTML, "innerHTML");
};
function escapeHTML_replace_multi(str) {
return str.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
}
var regex = new RegExp('[&"<>]', "g");
function escapeHTML_replace_func_regexcached(str) {
return str.replace(regex, function(c) {
return {
"&": "&",
'"': """,
"<": "<",
">": ">"
}[c];
});
}
function escapeHTML_replace_func(str) {
return str.replace(/[&"<>]/g, function(c) {
return {
"&": "&",
'"': """,
"<": "<",
">": ">"
}[c];
});
}
function escapeHTML_innerHTML(str) {
var div = document.createElement('div');
var text = document.createTextNode(str);
div.appendChild(text);
return div.innerHTML;
}
var escapeRules = {
"&": "&",
'"': """,
"<": "<",
">": ">"
};
function escapeHTML_replace_func_rulescached(s) {
return s.replace(/[&"<>]/g, function(c){
return escapeRules[c];
});
}
function escapeHTML_replace_func_rulescached_regexcached(s) {
return s.replace(regex, function(c){
return escapeRules[c];
});
}
function bench(f, str)
{
var test = 'ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう<del>えええええええええええええええええええ</del>おおおおおおおおおおおおおおおtest用 <br />"&';
var res = 'ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう<del>えええええええええええええええええええ</del>おおおおおおおおおおおおおおおtest用 <br />"&amp;';
var times = 50000;
if (f(test) != res) {
$("hoge").innerHTML += str + ": " + escapeHTML_replace_multi(f(test)) + "<br />";
return false;
}
var start = (new Date()).getTime();
for (var i = 0; i < times; ++i) {
f(test);
}
var end = (new Date()).getTime();
$("hoge").innerHTML += str + ": " + (end - start)/times + "<br />";
return true;
}
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4 ID:2006050817
replace_multi: 0.15406 replace_func_rulescached_regexcached: 0.23844 replace_func_rulescached: 0.2253 replace_func_regexcached: 0.24282 replace_func: 0.245 innerHTML: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう<del>えええええええええええええええええええ</del>おおおおおおおおおおおおおおおtest用 <br />"&amp;
Opera 9.00
replace_multi: 0.2575 replace_func_rulescached_regexcached: 0.17374 replace_func_rulescached: 0.17032 replace_func_regexcached: 0.21156 replace_func: 0.19062 innerHTML: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう<del>えええええええええええええええええええ</del>おおおおおおおおおおおおおおおtest用 <br />"&amp;
IE 6.0
replace_multi: 0.06282 replace_func_rulescached_regexcached: 0.08936 replace_func_rulescached: 0.09564 replace_func_regexcached: 0.14686 replace_func: 0.15376 innerHTML: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう<del>えええええええええええええええええええ</del>おおおおおおおおおおおおおおおtest用 <br />"&amp;