2010年3月18日木曜日

Ruby:XML:REXML vs. Nokogiri

REXMLとNokogiriの比較のため、先に書いたxmlファイルを使って次のようなプログラムを走らせました。REXMLもXpathを利用しています(どうやって同じような処理をさせたら良いのか分からなかったので(^^;)

require 'nokogiri'
require "rexml/document" # to parse the xml files
max = 30000


#REXML処理
include REXML
puts 'REXML'
f=File.open('abc.xml')
dayRs = Time.now
doc2 = REXML::Document.new(f)
count = 0
for i in 1..max
    XPath.each( doc2, "/a/c/d/attribute::type").each do |d|
        if d.to_s == 'AB' then
            count = count + 1
            # puts 'RE: '+d.to_s
        end
    end
end
dayRe = Time.now
f.close
puts dayRs
puts dayRe
puts dR=dayRe-dayRs
puts count


#Nokogiri処理
puts 'Nokogiri'
f=File.open('abc.xml')
dayNs = Time.now
doc=Nokogiri::XML(f)


count = 0
for i in 1..max
    doc.xpath("/a/c/d/attribute::type").each do |d|
        if d.to_s == 'AB' then
            count = count + 1
            # puts 'noko: '+d.to_s
        end
    end
end
dayNe = Time.now
puts dayNs
puts dayNe
puts dN=dayNe-dayNs
puts count


puts dR/dN     #比を取る

結果は、

REXML
Thu Mar 18 21:17:15 +0900 2010
Thu Mar 18 21:19:56 +0900 2010
161.166115  # (秒)
90000


Nokogiri
Thu Mar 18 21:19:56 +0900 2010
Thu Mar 18 21:20:01 +0900 2010
4.852485 # (秒)
90000


33.2131093656137 <= 比 33倍Nokogiriの方が高速

50MBのXMLファイルも普通に(めちゃくちゃ待たされることなく)読み込めました(^^V

0 件のコメント: