昨日、XML::Feedのベンチマークを取ったのだけど、miyagawaさんに突っ込みもらったので再調査。
XML::FeedはデフォルトではRSSのParseにXML::RSSを使っているらしい。昨日の記事の結果でXMl::FeedとXML::RSSの結果がほとんど同じだった*1のは当然のこと。そしてさらに、XML::FeedはパーサーにXML::RSS以外にもXML::LibXMLが使えるのもわかった。
$XML::Feed::RSS::PREFERRED_PARSER = "XML::RSS::LibXML";
とするとlibxmlが使われるようになる。これは高速化しそうな予感。これも含めて再度ベンチマークをとってみた。
Benchmark: timing 1000 iterations of XML::Feed with XML::RSS, XML::Feed with XML::RSS::LibXML, XML::LibXML, XML::RSS, XML::Simple, regexp... XML::Feed with XML::RSS: 301 wallclock secs (219.18 usr + 6.94 sys = 226.12 CPU) @ 4.42/s (n=1000) XML::Feed with XML::RSS::LibXML: 61 wallclock secs (46.00 usr + 2.04 sys = 48.04 CPU) @ 20.82/s (n=1000) XML::LibXML: 8 wallclock secs ( 5.36 usr + 0.45 sys = 5.81 CPU) @ 172.12/s (n=1000) XML::RSS: 308 wallclock secs (223.87 usr + 7.09 sys = 230.96 CPU) @ 4.33/s (n=1000) XML::Simple: 57 wallclock secs (40.63 usr + 2.82 sys = 43.45 CPU) @ 23.01/s (n=1000) regexp: 0 wallclock secs ( 0.26 usr + 0.01 sys = 0.27 CPU) @ 3703.70/s (n=1000) (warning: too few iterations for a reliable count)
ちょい見にくいけど。
XML::Feedでも、XML::RSSを使うと301 wallclockなのに対して、XML::RSS:LibXMLだと61 wallclockとなって5倍のスピードがでているのがわかる。XMl::LibXMLの8 wallclockに比べるとめちゃめちゃ速いわけではないけれど、かなり改善していてこれで問題ない場合も多そうだ。
PlaggerでもXML::FeedのXML::RSS::LibXMLモードが使われているようで、そのあたりも参考にできそう。PlaggerでPerlを学ぶメソッドがここでも有効。FeedParser.pmを参照。
実はXML::Simpleもパーサを選べたりするらしく、もう、夢がひろがりまくり。まさにTIMTOWTDIだわ。
*1:微妙にXML::RSSが速いってのはおかしいけど誤差よね