Atomのパース速度の比較

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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との比較だと同じ程度なので、単に比べたモジュールが高速なものが多かった、ということでしょう。 ソースは以下のとおり。

ソースコード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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;
}

Comments

comments powered by Disqus