[SP-pm] Res: Regular Expression

Eden Cardim edencardim em gmail.com
Quinta Janeiro 25 11:32:37 PST 2007


On 1/24/07, Wendel Scardua <wendelscardua em gmail.com> wrote:
> Não, pq isso vai imprimir zechim, e ele quer lzechim (em resumo, ele quer
> transformar wendel.scardua em wscardua)
>
> $n = 'lucas.zechim';
>  $n =~ s/^(.)[^.]*\./$1/
> print $n;
>
> A regexp também pode ser  s/(?<=^.)[^.]*\.//

Fiquei curioso quanto às implicações de desempenho dessas duas
regexes. Usar lookbehind tipicamente aumenta o custo da regex, porém,
neste caso, evita o uso de capturas, que também aumentam o custo. Será
que vale a pena trocar capturas por asserções de lookbehind? Para
comparar com as duas versões, utilizei um terceiro método, que não
utiliza capturas nem lookbehind, mas requer alguns passos adicionais
além da substituicao. Eis os resultados:

eden em anubis:~$ perl -MBenchmark=:all -e'$n = "lucas.zechim";
timethese(10000000, { capture => sub {$m = $n; $m =~
s/^(.)[^.]*\./$1/}, lookbehind => sub {$m = $n; $m =~
s/(?<=^.)[^.]*\.//} , butchery => sub {$m = $n; $o = substr($m, 0, 1);
$m =~ s/.*\.//; $m = "$o$m" } } )'
Benchmark: timing 10000000 iterations of butchery, capture, lookbehind...
  butchery: 14 wallclock secs (14.68 usr + -0.01 sys = 14.67 CPU) @
681663.26/s (n=10000000)
   capture: 29 wallclock secs (29.63 usr +  0.02 sys = 29.65 CPU) @
337268.13/s (n=10000000)
lookbehind: 18 wallclock secs (18.49 usr +  0.08 sys = 18.57 CPU) @
538502.96/s (n=10000000)

Conclusão: A penalidade das capturas é bem maior do que a penalidade
de lookbehind. Como os dois são bastante custosos, as vezes vale a
pena acrescentar algumas etapas fora da regex para obter o resultado,
como foi o caso presente.

-- 
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
"you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming."
merlyn - on irc.freenode.net#perl


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