XPathのスピードテスト

jottit.comのLDRize用XPath - FFFF - 0x
XPath - 枕を欹てて聴く
XPathとかCSSの評価にかかる時間のこと - ロックスターになりたい
関連。

AutoPagerize SITEINFOを保存して、そのHTMLで軽くテストしてみた。
xpath speed test
例によって、JSEnumeratorのBenchmarkツールをお借りました。

  • やはりid関数は高速
  • //p(/descendant-or-self::node()/child::p)より、/descendant::*/pのほうが高速
    • //pはDocument内のすべてのp要素を取得する
    • 先頭が/の場合のselfはDocument。そのdescendant::*はhtml以下のすべてのElementノードになる。そこで/pを選択すると、実質はDocument以下のすべてのp要素となる
    • //p(/descendant-or-self::node()/child::p)より/descendant::*/pが高速な要因は、node()と*の違いから。つまり、TextNodeなども含めた状態でp要素を選択しているか、ElementNode以外を先に除外しているかという違い。
    • ただし、JavaScript-XPathの場合、//pはdocument.getElementsByTagName('p')に相当するのでかなり高速だが、/descendant::*/pはdocument.getElementsByTagName('*')からpを抽出することになるので非効率になる(のだと思う)。
    • Operaは不安定なのであまり当てにならないけど、//pのほうが高速かもしれない
  • normalize-spaceはテキストの量によっては差が出る?

予想通り、ネイティブ実装同士は大きな差はないみたい。逆に言えば、ネイティブ実装とそうでない実装は差が出てくる。

どうも、Opera9.50は予想と違った(//pのほうが速かったり、|のほうが速かったりと)結果になっている気配で不思議。