Hatena::ブログ(Diary)

最遅メンヘル研究会

2010-02-06

タグ文字列から DOM 生成する比較

結構ばらついたので、あまり参考にならないベンチマーク (要 Firebug)
tag2dom
DOMParserRange + E4XRange (only)
271 ms192 ms88 ms

DOMParser の利点

他が使える環境なら、使う理由はないかも。

Range + E4X の利点

整形式じゃないとき (ノード列挙とか) に便利。

Range (only) の利点

現時点では、他より速い。ただし、整形式に限る。

2010-01-31

昨日のid:amachangの勉強会資料でよくわかんないところがあった

  elm.onclick = function() {

    elm.className = 'hoge';

    // 計算が走る要素は
    // いくつあるか?
  }
 <div>
   <div>...</div>
   <div>...</div>
   <div class="hoge"> - この影響範囲は?
     <div>...</div>
     <div>...</div>
   </div>
   <div>...</div>
   <div>...</div>
 </div>
404 Not Found

これJavaScriptの話なの? ↓みたいなCSSの話だと思った。

div.hoge + div {}
div.piyo + div {}

↓のソースでベンチとったら同じだった。とり方おかしいのかもだけど。

2009-11-29

neta

XPath 1.0 は貧弱だなぁと改めて思った。属性値列挙型に弱すぎる。

body > div.section > div.section 的なことをがんばった例。

var pred = [
  'contains(concat("^", @class), "^section")',
  'contains(concat(@class, "$"), "section$")',
  'contains(@class, " section ")'
].join(' or ');
var xpath = ['descendant::h:body/h:div[', ']/h:div[', ']'].join(pred);

@class = "section" が抜けてた。

と言うか、これでいいのか。

var pred = 'contains(concat(" ", @class, " "), " section ")';

Selectors benchmark

2009-05-07

シリアルサーチと正規表現の速度比較

なんかこれインチキなので調べ直した。まあ用途次第なんだけど……

Intel Core 2 Duo 3.16 GHz

UAver.indexOfmatchsearchexectest
Internet Explorer6.0.2900.2180.xpsp_sp2_qfe.090206-12392954325229
Google Chrome1.0.154.65361966
Mozilla Firefox3.0.10719193315
Opera9.64522222216
Safari3.2.2 (525.28.1)5116117
UAver.indexOfmatchsearchexectest
Google Chrome2.0.172.28251752
UAver.indexOfmatchsearchexectest
Safari4.0 (530.17)24242

Intel Celeron 2.93 GHz

UAver.indexOfmatchsearchexectest
Internet Explorer8.0.6001.1870216102279625
Google Chrome1.0.154.64313501212
Mozilla Firefox3.0.1013404111731
Opera9.641147504335
Safari3.2.2 (525.28.1)926112612
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>bm</title>
<pre id="outputArea"></pre>
<script type="text/javascript">// <![CDATA[
window.onload = function() {
  var run = 10, num = 10000, outputArea = document.getElementById('outputArea');
  var refText = 'XYZ', refExpr = new RegExp(refText), srcText ='JavaScript Search/RegExp Sample, JavaScriptによるシリアルサーチ検索/正規表現のサンプル, XYZ';
  (function() {
    for (var callback, args = Array.prototype.slice.call(arguments); callback = args.shift();) {
      for (var time = 0, i = run; i--;) {
        for (var s = new Date, j = num; j--;)
          callback();
        time += new Date - s;
      }
      outputArea.innerHTML += Math.ceil(time / run) + '|';
    }
  })(
    function() { srcText.indexOf(refText); },
    function() { srcText.match(refExpr); },
    function() { srcText.search(refExpr); },
    function() { refExpr.exec(srcText); },
    function() { refExpr.test(srcText); }
    );
};
// ]]></script>