[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