XML::Feedの読み込みベンチ

夏休みの課題でCatalyst::Model::XML::Feedを使ったという記事を書いた。しかし、このモジュールを使って、一回のクエリで5個も6個もFeedを読み込むようにするとページが表示されるまでにかなり時間がかかってしまって、Webアプリケーションとしてはあまり良くない。なんで、XMLを読み込むためのモジュールのベンチマークをとってどれを使えば一番早いか調べてみることにした。

と思って調べたら、相当前ににPerl で XML の処理はどれが速いかベンチ : NDO::Weblogというid:naoyaさんの記事で調べられていた。せっかくなんで、この記事で行われているベンチをXML::Feedにもやらせてみて比較してみることに。

元の記事のコードに

sub with_xml_feed {
    my @links = ();
    my $feed = XML::Feed->parse(\$content);
    for my $entry ($feed->entries) {
        push @links, $entry->link;
    }   
}

というサブルーチンを追加して。

Benchmark::timethese(1000, {
    'XML::Feed'   => \&with_xml_feed, # new for XML::Feed
    'regexp'      => \&with_regexp,
    'XML::Simple' => \&with_xml_simple,
    'XML::RSS'    => \&with_xml_rss,
    'XML::LibXML' => \&with_xml_libxml,
});

として実行した。そうすると、結果は以下のようになった。

Benchmark: timing 1000 iterations of XML::Feed, XML::LibXML, XML::RSS, XML::Simple, regexp...
 XML::Feed: 163 wallclock secs (92.52 usr +  1.57 sys = 94.09 CPU) @ 10.63/s (n=1000)
XML::LibXML:  5 wallclock secs ( 2.22 usr +  0.23 sys =  2.45 CPU) @ 408.16/s (n=1000)
  XML::RSS: 178 wallclock secs (91.55 usr +  1.55 sys = 93.10 CPU) @ 10.74/s (n=1000)
XML::Simple: 30 wallclock secs (17.15 usr +  0.81 sys = 17.96 CPU) @ 55.68/s (n=1000)
    regexp:  1 wallclock secs ( 0.11 usr +  0.00 sys =  0.11 CPU) @ 9090.91/s (n=1000)
            (warning: too few iterations for a reliable count)

結果、XML::Feedはそんなに早くない感じ。やはり、正規表現が鬼のように早い。XML::Simpleが昔にくらべてかなり高速化しているような?

Feed向けのいろんな機能を使うんじゃなくて、単に読み込みたいだけなら、より早いXML::LibXMLやXML::Simpleを使った方が良さげですね。うちは今回は早さが必要なので、XML::Simpleあたりを使ってみるかなぁ。

にしても、Perlは同じことするのに方法大杉。適材適所のモジュールを選び抜くのが肝だわな。