[Rio-pm] Performance de regex

Eden Cardim edencardim em gmail.com
Quarta Março 17 16:57:53 PDT 2010


2010/3/17 Marcos Machado <listas em istf.com.br>:
> Queridos,
>
> Precisei fazer uma alteração em um arquivo texto (bem grande)
> excluindo todas as linhas começando com "string1" ou contendo
> "string2".
>
> Meu primeiro chute foi:
>
> <code>
> cat OLD.log | perl -nle 'print if !/^string1|string2/;' > NEW.log
> </code>
>
> Levou 7 minutos. Depois testei com:
>
> <code>
> cat OLD.log | perl -nle 'print if !/^string1/ && !/string2/;' > NEW.log
> </code>
>
> O mesmo arquivo resultou, mas em apenas 30 segundos!
>
> Esse OU dentro da regex é mesmo muito mais lento ou fiz besteira?

Sim, o alternador dentro da regex é muito mais lento porque todas as
alternativas são analisadas em todas as posições antes da próxima
posição ser analisada. O uso de operadores shortcut fora da regex vai
eliminar processamento desnecessário, no caso, !/string2/ não vai ser
avaliado caso o resultado de !/^string1/ seja falso, isso economiza
processamento. O otimizador de regexes geralmente consegue trabalhar
melhor com strings individuais do que com várias alternativas. Esse
caso está documentado no Camel Book, terceira edição, capítulo 5.9.

-- 
   Eden Cardim       Need help with your Catalyst or DBIx::Class project?
  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://edenc.vox.com/            http://www.shadowcat.co.uk/servers/


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