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のほうが速かったり、|のほうが速かったりと)結果になっている気配で不思議。