[Moscow.pm] POE::Filter::Line
Ruslan Zakirov
ruz на bestpractical.com
Сб Мар 29 07:52:49 PDT 2008
Можно файлом получить ето дело. Чтобы форматирование не билось.
On Sat, Mar 29, 2008 at 5:43 PM, Ivan B. Serezhkin <ivan на serezhkin.com> wrote:
> Привет.
>
> В прошлом письме наврал, вместо индекса опять замерил регекс.
>
> Rate Line Index Regexp
> Line 4.78/s -- -88% -96%
> Index 39.4/s 725% -- -64%
> Regexp 109/s 2191% 178% --
>
>
>
>
> freebsd7 stable perlmalloc
> Rate Line Index Regexp
> Line 4.74/s -- -96% -96%
> Index 108/s 2188% -- -1%
> Regexp 109/s 2208% 1% --
>
> =code
>
> use Storable qw(freeze dclone);
> use Benchmark qw(:all) ;
> use POE::Filter::Line;
>
> my @s=map {join '', map { 'SEPARATOR'.'data'x(100+int(rand(100))) }
> (1..100)} (1..10);
> cmpthese(100, {
> Regexp => sub {
> my $data=dclone(\@s);
> my $f=POE::Filter::Regexp->new(qr/SEPARATOR/);
> $f->get($data);
> },
> Index => sub {
> my $data=dclone(\@s);
> my $f=POE::Filter::Regexp->new(qr/SEPARATOR/);
> $f->get($data);
> },
> Line => sub {
> my $data=dclone(\@s);
> my $f=POE::Filter::Line->new(InputRegexp => qr/SEPARATOR/);
> $f->get($data);
> },
> });
>
>
>
> package POE::Filter::Regexp;
> use strict;
>
> use vars qw($VERSION);
>
> $VERSION='Production 1.0';
>
>
> sub new {
> my ($class,$re)=@_;
> $re ||= qr/\n/;
> die "Param in new must be a Regexp but this is a ".ref($re) unless ref
> $re eq 'Regexp';
> return bless [
>
> [], # ready queue
> '', # raw unparsed data
>
> $re,
> ], $class;
> }
>
> sub get {
> my ($self, $stream) = @_;
> my @ret;
>
> while($_=shift @$stream){
> $self->[1].=$_;
> $_=''; #yah we'r cl'r mems !!!111
> my $p=0;
> while($self->[1]=~/$self->[2]/gm) {
>
> next unless $-[0]; #begin of stream
> push @ret, substr($self->[1], $p, $-[0]-$p);
> $p=$-[0];
> }
>
> substr($self->[1], 0, $p)='';
> }
> $self->[1]=''.$self->[1]; #Clean holes in string.
> return \@ret;
> }
>
>
>
>
> package POE::Filter::Index;
> use strict;
> use vars qw($VERSION);
>
> $VERSION='Devel';
>
> sub new {
> my ($class,$sep)=@_;
> $sep ||= "\n";
> return bless [
> [], # ready queue
> '', # raw unparsed data
> $sep,
>
> ], $class;
> }
>
> sub get {
> my ($self, $stream) = @_;
> my @ret;
>
> while($_=shift @$stream){
> $self->[1].=$_;
> $_=''; #yah we'r cl'r mems 4 4ture iterations !!!111 one one
> my $b=0; #base
> while((my $p=index($self->[1], $self->[2], $b+1)) >0) {
> push @ret, substr($self->[1], $b, $p-$b);
> $b=$p;
> }
> substr($self->[1], 0, $b)='';
> }
> $self->[1]=''.$self->[1]; #Clean holes in string.
> return \@ret;
> }
>
>
> =cut
>
>
>
>
>
>
> Ruslan Zakirov wrote:
>
>
> > Набросал бенчмарк, но только простенький и последняя версия в слайдах
> > была совершенно другой. Надеюсь подправите и вернете назад чтобы я мог
> > варианты ss1 и ss2 привести к единому варианту ответа, пока они
> > отличаются.
> >
> > amd64, gentoo, system malloc.
> >
> > Rate re ss2 ss1
> > re 6381/s -- -51% -81%
> > ss2 12961/s 103% -- -62%
> > ss1 34367/s 439% 165% --
> >
> >
> > 2008/3/17 Ivan B. Serezhkin <ivan на serezhkin.com>:
> >
> >> Привет.
> >> Может кому и интересно ?
> >> получил прирос в 25 раз на больших файлах.
> >> Можете поругать стиль =)
> >> На очереди сделать нормальный быстрый драйвер.
> >> И кстати, это удобный темплейт для написания своих фильтров, например
> >> POE::Filter::Log::Postfix =)
> >> Использовать так:
> >>
> >> Wheel ...
> >> Driver => POE::Driver::SysRW->new( BlockSize => 256*1024*1024) ,
> >> Filter => POE::Filter::Regexp->new(qr/RecordSeparator/),
> >> ....
> >>
> >>
> >>
> >> package POE::Filter::Regexp;
> >> use strict;
> >>
> >> sub new {
> >> my ($class,$re)=@_;
> >> $re ||= qr/\n/;
> >> die "Param in new must be a Regexp but this is a ".ref($re) unless ref
> >> $re eq 'Regexp';
> >> return bless [
> >> '', # raw unparsed data
> >> [], # ready queue
> >> $re,
> >> ], $class;
> >> }
> >>
> >> sub get {
> >> my ($self, $stream) = @_;
> >> my @ret;
> >> while($self->[0].=shift @$stream){
> >> my $p=0;
> >> while($self->[0]=~/$self->[2]/g) {
> >> next unless $-[0]; #begin of stream
> >> push @ret, substr($self->[0], $p, $-[0]-$p);
> >> $p=$-[0];
> >> }
> >> substr($self->[0], 0, $p)=undef;
> >> }
> >> return \@ret;
> >> }
> >> 1;
> >>
> >> --
> >> Ivan B. Serezhkin
> >>
> >> --
> >> Moscow.pm mailing list
> >> moscow-pm на pm.org | http://moscow.pm.org
> >> http://mail.pm.org/mailman/listinfo/moscow-pm
> >>
> >
> >
> >
> >
> > ------------------------------------------------------------------------
>
>
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm на pm.org | http://moscow.pm.org
> > http://mail.pm.org/mailman/listinfo/moscow-pm
>
>
> --
> Ivan B. Serezhkin
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
> http://mail.pm.org/mailman/listinfo/moscow-pm
--
Best regards, Ruslan.
Подробная информация о списке рассылки Moscow-pm