tokuhirom's Blog

jsdom と libxmlext のベンチマークとったよ!

node.js において jquery-ish な css selector をもちいた検索をしたい、という場合、jsdom がオススメされることがおおいのだが、jsdom は pure-js で実装されているせいか、あまり高速ではない。体感速度からして、あきらかにおそい。

どのぐらい遅いのかということを、libxmlext と jsdom のベンチマークをとることによりためしてみる。

jsdom x 6.43 ops/sec ±7.28% (17 runs sampled)
libxmlext x 168 ops/sec ±2.93% (55 runs sampled)
Fastest is libxmlext

libxmlext の方が 26倍はやいようだ。

利点と欠点の比較

jsdom の利点は

  • jquery っぽい操作ができる
  • jquery 互換の css selector がつかえる
  • 人気が高い

欠点は

  • 非常に遅い(クローラなどをつくる場合には致命的なぐらいに遅い)
  • 素でつかうと jquery を毎度とりにいって遅いし、jquery をとってこようとおもうと wget とかつかわなくちゃいけなくてちょっとめんどくさい

libxmlext の利点は

  • libxml2 + css2xpath(正規表現でがんばって置換して xpath に変換するやつ) による高速な処理

欠点は

  • 'td.title:not(:last) a' のようなクエリが処理できない。
    • jquery 拡張だからかも。
  • ライブラリ自体があんまメンテされてない
  • ドキュメントが皆無
    • とはいえ、ライブラリのコード量がきわめてすくないので fork は容易なので問題視していない
  • libxml のメソッドをおぼえないといけない
    • ここにかんしては、がんばって libxml.Element.prototype を拡張したらつかいやすくなるかもなあ、とおもったりはする。

まとめ

クローラーとか書くなら libxml つかわないと速度でないし、node.js つかってることによって I/O 多重化にかんするメリットが jsdom をつかうことにより CPU 時間をつかわれまくって意味がないかんじになるので、jsdom はカジュアル用途以外ではオススメできないと感じる。

具体的にいうと、367個の HTML ファイルを操作したい、というようなレベルの要求レベルでも jsdom だと遅くてやってられんわーという気分になるレベル。というかそれが嫌になって他の手段をさがしたぐらいのかんじである。

なお同等な機能をもつものに nquery があるが、これは find などにかんしては非常によくうごくのだが、破壊的操作をサポートしていないのでつかえない。