[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