harry’s memorandum

おれおれメモ

Nokogiriが速いそうです

NokogiriというXML/HTMLパーサが速いそうです。
http://nokogiri.rubyforge.org/nokogiri/

Nokogiri parses and searches XML/HTML faster than Hpricot, and also has correctly implemented CSS3 selector support as well as XPath support.

Hpricotより速いよ、って書いてあります。

ためしに、前回Hpricotで書いた Yahoo路線情報から岐阜->秋田間の運賃を取得するコードを
hrpticot -> nokogiri に変更しただけのコードでベンチマークを取ってみました。

サンプルコード

require 'rubygems'
#require 'hpricot'
require 'nokogiri'
require 'open-uri'
require 'kconv'

## 岐阜 -> 秋田
url = "http://transit.yahoo.co.jp/search/result?from=%E5%B2%90%E9%98%9C&to=%E7%A7%8B%E7%94%B0&via=&shin=1&ex=1&hb=1&al=1&ym=200810&d=29&hh=02&m1=1&m2=3&type=1&ost=0&ei=utf-8&x=59&y=5"

class YahooTransit
  def initialize(url)
    @url = url
    #@doc = Hpricot(open(@url).read)
    @doc = Nokogiri(open(@url).read)
    @parse_tag = "span[@class^='route-fare']"
  end
  def expense
    (@doc/@parse_tag).map {|elem| elem.inner_html.toutf8.gsub(/[^0-9]/,'') }.sort
  end
end

yt = YahooTransit.new(url)
puts yt.expense.join(",") #=> 30740,30830,31980

ベンチ

  • time ruby hoge.rbを3回実行。
  • 実行マシンはCPU Core2Duo T7250 2GHz, Memory 2GB

Hpricotのベンチ

real user sys
1回 0m1.619s 0m0.368s 0m0.040s
2回 0m1.730s 0m0.344s 0m0.048s
3回 0m1.639s 0m0.376s 0m0.064s

Nokogiriのベンチ

real user sys
1回 0m1.659s 0m0.240s 0m0.032s
2回 0m1.560s 0m0.196s 0m0.060s
3回 0m2.061s 0m0.212s 0m0.040s

サンプルがいまいちだったので、体感で大きな差はありませんでしたが、ベンチをみるとNokogiriの方が性能は良さそうですね。
もうすこしデータ量を大きくして試すと、かなり差がでそうです。