[Moscow.pm] POE::Filter::Line
Ruslan Zakirov
ruz на bestpractical.com
Сб Мар 29 08:34:08 PDT 2008
я┌п╟п╪ п╬я┬п╦п╠п╨п╟ п╥п╟п╨я─п╟п╩п╟я│я▄. п÷п╬п©я─п╠я┐п╧я┌п╣ п╡п╬я┌ я┌п╟п╨п╬п╧ п╡п╟я─п╦п╟п╫я┌.
п╪п╫п╣ п╫я┐п╤п╫п╬ я┐п╠п╣пЁп╟я┌я▄.
2008/3/29 Ivan B. Serezhkin <ivan на serezhkin.com>:
> Ruslan Zakirov wrote:
> > п°п╬п╤п╫п╬ я└п╟п╧п╩п╬п╪ п©п╬п╩я┐я┤п╦я┌я▄ п╣я┌п╬ п╢п╣п╩п╬. п╖я┌п╬п╠я▀ я└п╬я─п╪п╟я┌п╦я─п╬п╡п╟п╫п╦п╣ п╫п╣ п╠п╦п╩п╬я│я▄.
> >
> > 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% --
> >>
>
>
> --
> Ivan B. Serezhkin
>
>
> #!/usr/bin/perl
> # -*- Encoding: utf-8; Mode: cperl -*-
> use strict;
> use utf8;
> 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::Index->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
> my $p;
> while(($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;
> }
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
> http://mail.pm.org/mailman/listinfo/moscow-pm
>
--
Best regards, Ruslan.
----------- следущая часть -----------
п▓п╩п╬п╤п╣п╫п╦п╣ п╫п╣ п╡ я┌п╣п╨я│я┌п╬п╡п╬п╪ я└п╬я─п╪п╟я┌п╣ п╠я▀п╩п╬ п╦п╥п╡п╩п╣я┤п╣п╫п╬…
п≤п╪я▐ : poe_filter_split2.pl
п╒п╦п© : application/x-perl
п═п╟п╥п╪п╣я─ : 2401 п╠п╟п╧я┌п╬п╡
п·п©п╦я│п╟п╫п╦п╣: п╬я┌я│я┐я┌я│я┌п╡я┐п╣я┌
Url : http://mail.pm.org/pipermail/moscow-pm/attachments/20080329/61a1fe72/attachment-0001.bin
Подробная информация о списке рассылки Moscow-pm