XML::Hash::XS - сверхскоростная замена для XMLout
СкоростьПоковыряв настроки, быстро составил заклинание правильного вызова (чтобы output был совместим с XMLout). Написал тест.
#! /usr/bin/perl -w
use strict;
use XML::Hash::XS;
use XML::Simple qw(XMLout);
use Benchmark;
use Storable;
use Encode qw(_utf8_on);
my $hashref = retrieve('hash.bin');
my $in = {};
$in->{page} = $hashref;
my $xml_hash_xs = XML::Hash::XS->new(
xml_decl=>0,
indent=>1,
root=>'page',
use_attr=>1,
content =>'content',
encoding => 'utf-8',
);
my $t0 = Benchmark->new;
for (1..3000) {
my $content = $xml_hash_xs->hash2xml($in->{page});
Encode::_utf8_on($content);
}
my $t1 = Benchmark->new;
for (1..3000) {
my $content = XMLout($hashref, RootName => 'page', SuppressEmpty => 1,);
}
my $t2 = Benchmark->new;
my $td1 = timediff($t1, $t0);
my $td2 = timediff($t2, $t1);
print "the code took:",timestr($td1),"\n";
print "the code took:",timestr($td2),"\n";
exit;На рабочем компьютере у меня получились следующие результаты the code took: 1 wallclock secs ( 0.81 usr + 0.00 sys = 0.81 CPU)
the code took:32 wallclock secs (32.08 usr + 0.00 sys = 32.08 CPU)Почувствуйте разницу почти в 40 раз. В Storable загонял первый подвернувшийся под руку xml-хеш размером около 70 кб. Примерно таким скриптом: #! /usr/bin/perl -w
use strict;
use Storable;
use XML::Simple qw(XMLin);
my $xml = q`<?xml version="1.0" encoding="utf-8"?>
<page>
.....
</page>`;
my $hashref = XMLin($xml);
store $hashref, 'hash.bin';В процессе разных тестов, обнаружил баг, отписался автору на мыло и за выходные баг был оперативно уничтожен, за что спасибо Юрию. Собственно, ради чего ломались копья? Заменил в своем проекте XMLout на hash2xml - реальная скорость выросла на четверть, ну может на 20% - мелочь, а приятно. Все-таки в реальных проектах не только хеши в xml преобразуются. Могу сказать, что рекомендую к регулярному использованию "сишный" модуль XML::Hash::XS.
Впрочем, на долю XML::Simple остается важная функция - XMLin, хотя для таких преобразований на CPAN значительно больше вариантов.
