夏休みの課題で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は同じことするのに方法大杉。適材適所のモジュールを選び抜くのが肝だわな。