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;
}
|