[Cascavel-pm] Duvida expressao regular?

Alceu Rodrigues de Freitas Junior glasswalk3r em hotmail.com
Quinta Outubro 18 09:57:23 PDT 2007


> Date: Thu, 18 Oct 2007 14:05:46 -0200
> From: acid06 em gmail.com
> On 10/18/07, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
> > A segunda opcao eh "/o", que quer dizer "compile Once" - informa o Perl
> > de que a expressao regular em questao nao muda ao longo do programa e
> > pode ser compilada apenas uma vez. Isso ajuda a performance do programa,
> > quando voce usa expressoes regulares "estaticas" - que nao variam
> > dependendo de outras informacoes do seu programa - em loops muito
> > longos.
> 
> Na verdade, acho que atualmente não faz muito sentido usar a opção /o.
> Além de não prover ganhos de performance, ela é, na verdade, um pouco
> pior:
> 
>   use Benchmark qw/cmpthese/;
> 
>   cmpthese(5000, {
>       normal => sub {
>           for (1000..1999) { $i++ if /[13579]$/ }
>       },
>       with_o => sub {
>           for (1000..1999) { $i++ if /[13579]$/o }
>       }
>   } );
> 
> Resultados:
> 
>            Rate normal with_o
>   normal 1720/s     --    -2%
>   with_o 1758/s     2%     --

Na minha máquina deu diferente:

         Rate with_o normal
with_o 2064/s     --    -1%
normal 2077/s     1%     --

Eu executei várias vezes o teste, mas o with_o saiu na frente a maioria das vezes. O engraçado é que ele deveria ser melhor se houvesse algo para interpolar na regex.

Eu achei isso estranho e resolvi fazer mais dois testes:

<test2>
use Benchmark qw/cmpthese/;

my $string = 'foobar';
my $compiled = qr/[13579]($string)?/;
my $i;

cmpthese(
    5000,
    {
        normal_with_text => sub {
            for ( 1000 .. 1999 ) { $i++ if /[13579]($string)?/ }
        },
        with_o_and_text => sub {
            for ( 1000 .. 1999 ) { $i++ if /[13579]($string)?/o }
        },
        compile_with_qr => sub {
            for ( 1000 .. 1999 ) { $i++ if /$compiled/ }
          }
    }
);
</test2>

O resultado foi mais estranho ainda:

                  Rate normal_with_text  with_o_and_text  compile_with_qr
normal_with_text 713/s               --              -5%             -18%
with_o_and_text  748/s               5%               --             -14%
compile_with_qr  865/s              21%              16%               --

Mais um teste:

<test3>
use Benchmark qw(cmpthese);

my $string = 'foobar';
my $compiled = qr/$string/;
my $i;

cmpthese(
    200000,
    {
        normal_with_text => sub {
            for ( a .. z ) { $i++ if /$string/ }
        },
        with_o_and_text => sub {
            for ( a .. z ) { $i++ if /$string/o }
        },
        compile_with_qr => sub {
            for ( a .. z ) { $i++ if /$compiled/ }
          }
    }
);
</test3>

E o resultado foi algo mais razoável (mas a expressão regular foi alterada):

                     Rate  compile_with_qr normal_with_text  with_o_and_text
compile_with_qr   89485/s               --              -1%             -12%
normal_with_text  90785/s               1%               --             -11%
with_o_and_text  101523/s              13%              12%               --

A única coisa que consigo tirar desse teste é que é difícil afirmar qual técnica funcionará melhor. Aparentemente dependerá também expressão regular sendo verificada, então só testes com Benchmark para afirmar o que funciona mais rápido.

Só para constar:

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 50 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 820 [274739] provided by ActiveState http://www.ActiveState.com
Built Jan 23 2007 15:57:46

Rodando em um processador Centrino Duo 1.66GHz, com 504MB de RAM (maldita placa de vídeo!).

Se alguém mais topar rodar os testes e mandar pra lista, pode ser interessante.

[]'s
Alceu

_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20071018/e93859ea/attachment-0001.html 


Mais detalhes sobre a lista de discussão Cascavel-pm