激しく誤差の範囲内の予感

追記

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, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
var regex = new RegExp('[&"<>]', "g");
function escapeHTML_replace_func_regexcached(str) {
  return str.replace(regex, function(c) {
    return {
      "&": "&amp;",
      '"': "&quot;",
      "<": "&lt;",
      ">": "&gt;"
    }[c];
  });
}
function escapeHTML_replace_func(str) {
  return str.replace(/[&"<>]/g, function(c) {
    return {
      "&": "&amp;",
      '"': "&quot;",
      "<": "&lt;",
      ">": "&gt;"
    }[c];
  });
}
function escapeHTML_innerHTML(str) {
  var div = document.createElement('div');
  var text = document.createTextNode(str);
  div.appendChild(text);
  return div.innerHTML;
}
var escapeRules = {
  "&": "&amp;",
  '"': "&quot;",
  "<": "&lt;",
  ">": "&gt;"
};
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 />"&amp;';
  var res = 'ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう&lt;del&gt;えええええええええええええええええええ&lt;/del&gt;おおおおおおおおおおおおおおおtest用 &lt;br /&gt;&quot;&amp;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: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう&lt;del&gt;えええええええええええええええええええ&lt;/del&gt;おおおおおおおおおおおおおおおtest用 &lt;br /&gt;"&amp;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: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう&lt;del&gt;えええええええええええええええええええ&lt;/del&gt;おおおおおおおおおおおおおおおtest用 &lt;br /&gt;"&amp;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: ああああああああああいいいいいいいいいいいいいいうううううううううううううううううううう&lt;del&gt;えええええええええええええええええええ&lt;/del&gt;おおおおおおおおおおおおおおおtest用 &lt;br /&gt;"&amp;amp;