« Estraierを試してみる | メイン | XML::RAIのバグ »

XML:RAI XML::RSSとの比較

XML::RAIというRSS Parser モジュールがあります。

The RSS Abstraction Interface, or RAI (said "ray"), provides an object-oriented interface to XML::RSS::Parser trees that abstracts the user from handling namespaces, overlapping and alternate tag mappings.


どういうものかというと、

my $rai = XML::RAI->parse($doc);
foreach my $item (@{$rai->items}){
	print $item->content;
}

としたときに表示されるのは、

* xhtml:body
* xhtml:div
* content:encoded
* description
* dc:description
* rss091:description

の中から自動的に選択してくれます。
RSSにはいろいろバージョンありますけど、その違いも吸収できるのです。

RSSのパーサーとしては、XML::RSSがスタンダートなのだが、比較のベンチマークをしてみた。

結果1 - このblogのRSS(v1.0)を読み込ませた場合

Benchmark: timing 100 iterations of XML::RAI, XML::RSS...
XML::RAI: 23 wallclock secs (23.20 usr +  0.11 sys = 23.31 CPU) @  4.29/s (n=100)
XML::RSS: 33 wallclock secs (33.36 usr +  0.01 sys = 33.37 CPU) @  3.00/s (n=100)


これを見て、XML::RSSより速いのかと、思ったが、

結果2 - Yahoo!の新着情報のRSS(v2.0)の場合

Benchmark: timing 100 iterations of XML::RAI, XML::RSS...
  XML::RAI:  8 wallclock secs ( 8.10 usr +  0.02 sys =  8.12 CPU) @ 12.32/s (n=100)
  XML::RSS:  6 wallclock secs ( 5.15 usr +  0.00 sys =  5.15 CPU) @ 19.42/s (n=100)


という結果が出るところをみると、データによりそれぞれ。
まぁ、両方とも、XML::Parserを使っているのでそれほど違いがでないのでしょう。

前回のベンチで試したXML::LibXMLが速いのは間違いない。
ただ、XML::RAIは便利だと思う。

以下実行したスクリプト

#!/usr/bin/perl -w

use strict;
use IO::File;
use XML::RAI;
use XML::RSS;
use Benchmark;

my $fh = IO::File->new($ARGV[0]) or die $!;
my $doc="";
while(my $ret=$fh->getline){
	$doc.=$ret;
}


Benchmark::timethese(100, {
    'XML::RSS' =>\&with_xml_rss,
    'XML::RAI' => \&with_xml_rai,
});

sub with_xml_rss{
	my %rss;
	my $rss = XML::RSS->new;
	$rss->add_module(
		prefix=>"content",
		uri=>"http://purl.org/rss/1.0/modules/content/"
	);
	$rss->parse($doc);
	
	my $channel = $rss->channel;
	$rss{title} = $channel->{title};
	$rss{link} = $channel->{link};
	my @items;
	foreach my $item (@{$rss->{items}}){
		my %item;	
		$item{title}=$item->{title};
		$item{link}=$item->{link};
		$item{description}=$item->{content}->{encoded} || $item->{description};
		$item{date}=$item->{dc}->{date};
		push(@items,\%item);
	}
	$rss{items}=\@items;
}


sub with_xml_rai{
	my %rss;
	my $rai = XML::RAI->parse($doc);
	my $channel=$rai->channel;
	$rss{title}=$channel->title;
	$rss{link}=$channel->link;
	my @items;
	foreach my $item (@{$rai->items}){
		my %item;
		$item{title}=$item->title;
		$item{link}=$item->link;
		$item{description}=$item->content;
		$item{date}=$item->issued;
	}
	$rss{items}=\@items;
}

コメント

初めまして。
RAIのベンチですが、
pushしてませんよー

コメントを投稿