Atomのパース速度の比較

2009年2月28日
| コメント(0) | トラックバック(1) Atomのパース速度の比較

RSSもいいけど、今後のことを思えばAtomも欠かせません。
ざっくりとCPANを漁っていくつか見繕ってベンチマークしました。
ついでにXPathでAtomを解析してみました。
いまいち納得はいきませんが、とりあえず同じ出力を得ることができたので良しとします。

Benchmark: running Data::Feed, XML::Atom, XML::Feed, XML::FeedPP, XML::LibXML for at least 3 CPU seconds...
Data::Feed:  3 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 413.88/s (n=1300)
 XML::Atom:  3 wallclock secs ( 3.20 usr +  0.00 sys =  3.20 CPU) @ 525.76/s (n=1684)
 XML::Feed:  3 wallclock secs ( 3.28 usr +  0.02 sys =  3.30 CPU) @ 415.23/s (n=1369)
XML::FeedPP:  3 wallclock secs ( 3.19 usr +  0.00 sys =  3.19 CPU) @ 120.49/s (n=384)
XML::LibXML:  3 wallclock secs ( 3.16 usr +  0.05 sys =  3.20 CPU) @ 1105.81/s (n=3543)
              Rate XML::FeedPP  Data::Feed   XML::Feed   XML::Atom XML::LibXML
XML::FeedPP  120/s          --        -71%        -71%        -77%        -89%
Data::Feed   414/s        243%          --         -0%        -21%        -63%
XML::Feed    415/s        245%          0%          --        -21%        -62%
XML::Atom    526/s        336%         27%         27%          --        -52%
XML::LibXML 1106/s        818%        167%        166%        110%          --

Atomは「Perl - Google ブログ検索」な感じの10件です。

結果から見ると、やはりXML::LibXMLの一人勝ち。XPathさえきっちり書くことができるなら、これを使うのが良いでしょうね。
XML::Atom(実際はXML::Atom::Feedですが)は、PPを除いた他の二つよりは少し速いです。これはAtomに特化しているからかもしれませんが。
XML::FeedとData::Feedはほぼ同じ程度でした。
また、XML::FeedPPは残念な結果でした。しかし、Atomだから遅いというわけではなく、LibXMLとの比較だと同じ程度なので、単に比べたモジュールが高速なものが多かった、ということでしょう。

ソースは以下のとおり。

ソースコード

use strict;
use warnings;
use Data::Dumper;
 
use Benchmark qw(:all);
use FileHandle;
use XML::LibXML;
use XML::Atom::Feed;
use Data::Feed;
use XML::Feed;
use XML::FeedPP;
 
my $feed_file = q{../atom.xml};
my $fh = FileHandle->new($feed_file)
    or die "cannot open $feed_file: $!";
local $/; # slurp mode
our $content = $fh->getline;
$fh->close;
 
cmpthese(timethese(0,
{
    'XML::Atom'   => \&with_xml_atom,
    'Data::Feed'  => \&with_data_feed,
    'XML::Feed'   => \&with_xml_feed,
    'XML::FeedPP' => \&with_xml_feedpp,
    'XML::LibXML' => \&with_xml_libxml,
}));
 
sub with_xml_libxml {
    my @links =();
    my $parser = XML::LibXML->new;
    my $doc = $parser->parse_string($content);
    my @nodes = $doc->findnodes(
        qq{//*[name()='entry']/*[name()='link']}
    );
    for my $node (@nodes) {
        push @links, $node->getAttribute('href');
    }
#    print Dumper \@links;
}
 
sub with_xml_feedpp {
    my @links = ();
    my $feed = XML::FeedPP->new($content);
    foreach my $item ( $feed->get_item() ) {
        push @links, $item->link;
    }
#    print Dumper \@links;
}
 
sub with_xml_feed {
    my @links = ();
    my $atom = XML::Feed->parse(\$content);
    for my $entry ($atom->entries) {
        push  @links, $entry->link;
    }
#    print Dumper \@links;
}
 
sub with_data_feed {
    my @links = ();
    my $atom = Data::Feed->parse(\$content);
    for my $entry ($atom->entries) {
        push  @links, $entry->link;
    }
#    print Dumper \@links;
}
 
sub with_xml_atom {
    my @links = ();
    my $atom = XML::Atom::Feed->new(\$content);
    for my $entry ($atom->entries) {
        for my $link ($entry->link) {
            push  @links, $link->href;
        }
    }
#    print Dumper \@links;
}

トラックバック(1)

このブログ記事に対するトラックバックURL:

このブログ記事を参照しているブログ一覧:

何かで使えそうな気がして、Feed(RSSとかAtomとか)をウェブから取ってき... 続きを読む

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2009年2月28日 01:46に書いたブログ記事です。

ひとつ前のブログ記事は「XML::Simple におけるパーサーの実行速度比較」です。

次のブログ記事は「Web::Scraperに入門した」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type