<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>&gt; Date: Thu, 18 Oct 2007 14:05:46 -0200<br>&gt; From: acid06@gmail.com<br>&gt; On 10/18/07, Luis Motta Campos &lt;luismottacampos@yahoo.co.uk&gt; wrote:<br>&gt; &gt; A segunda opcao eh "/o", que quer dizer "compile Once" - informa o Perl<br>&gt; &gt; de que a expressao regular em questao nao muda ao longo do programa e<br>&gt; &gt; pode ser compilada apenas uma vez. Isso ajuda a performance do programa,<br>&gt; &gt; quando voce usa expressoes regulares "estaticas" - que nao variam<br>&gt; &gt; dependendo de outras informacoes do seu programa - em loops muito<br>&gt; &gt; longos.<br>&gt; <br>&gt; Na verdade, acho que atualmente não faz muito sentido usar a opção /o.<br>&gt; Além de não prover ganhos de performance, ela é, na verdade, um pouco<br>&gt; pior:<br>&gt; <br>&gt;   use Benchmark qw/cmpthese/;<br>&gt; <br>&gt;   cmpthese(5000, {<br>&gt;       normal =&gt; sub {<br>&gt;           for (1000..1999) { $i++ if /[13579]$/ }<br>&gt;       },<br>&gt;       with_o =&gt; sub {<br>&gt;           for (1000..1999) { $i++ if /[13579]$/o }<br>&gt;       }<br>&gt;   } );<br>&gt; <br>&gt; Resultados:<br>&gt; <br>&gt;            Rate normal with_o<br>&gt;   normal 1720/s     --    -2%<br>&gt;   with_o 1758/s     2%     --<br><br>Na minha máquina deu diferente:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rate with_o normal<br>with_o 2064/s&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp; -1%<br>normal 2077/s&nbsp;&nbsp;&nbsp;&nbsp; 1%&nbsp;&nbsp;&nbsp;&nbsp; --<br><br>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.<br><br>Eu achei isso estranho e resolvi fazer mais dois testes:<br><br>&lt;test2&gt;<br>use Benchmark qw/cmpthese/;<br><br>my $string = 'foobar';<br>my $compiled = qr/[13579]($string)?/;<br>my $i;<br><br>cmpthese(<br>&nbsp;&nbsp;&nbsp; 5000,<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normal_with_text =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( 1000 .. 1999 ) { $i++ if /[13579]($string)?/ }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with_o_and_text =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( 1000 .. 1999 ) { $i++ if /[13579]($string)?/o }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compile_with_qr =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( 1000 .. 1999 ) { $i++ if /$compiled/ }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>);<br>&lt;/test2&gt;<br><br>O resultado foi mais estranho ainda:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rate normal_with_text&nbsp; with_o_and_text&nbsp; compile_with_qr<br>normal_with_text 713/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -5%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -18%<br>with_o_and_text&nbsp; 748/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -14%<br>compile_with_qr&nbsp; 865/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --<br><br>Mais um teste:<br><br>&lt;test3&gt;<br>use Benchmark qw(cmpthese);<br><br>my $string = 'foobar';<br>my $compiled = qr/$string/;<br>my $i;<br><br>cmpthese(<br>&nbsp;&nbsp;&nbsp; 200000,<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normal_with_text =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( a .. z ) { $i++ if /$string/ }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with_o_and_text =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( a .. z ) { $i++ if /$string/o }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compile_with_qr =&gt; sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( a .. z ) { $i++ if /$compiled/ }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>);<br>&lt;/test3&gt;<br><br>E o resultado foi algo mais razoável (mas a expressão regular foi alterada):<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rate&nbsp; compile_with_qr normal_with_text&nbsp; with_o_and_text<br>compile_with_qr&nbsp;&nbsp; 89485/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -12%<br>normal_with_text&nbsp; 90785/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -11%<br>with_o_and_text&nbsp; 101523/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --<br><br>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.<br><br>Só para constar:<br><br>This is perl, v5.8.8 built for MSWin32-x86-multi-thread<br>(with 50 registered patches, see perl -V for more detail)<br><br>Copyright 1987-2006, Larry Wall<br><br>Binary build 820 [274739] provided by ActiveState http://www.ActiveState.com<br>Built Jan 23 2007 15:57:46<br><br>Rodando em um processador Centrino Duo 1.66GHz, com 504MB de RAM (maldita placa de vídeo!).<br><br>Se alguém mais topar rodar os testes e mandar pra lista, pode ser interessante.<br><br>[]'s<br>Alceu<br><br /><hr />Explore the seven wonders of the world <a href='http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE' target='_new'>Learn more!</a></body>
</html>