[Rio-pm] Performance de regex

breno breno em rio.pm.org
Segunda Março 22 16:26:07 PDT 2010


grande MM, pode fazer um teste pra mim?

se as strings procuradas não são expressões regulares, experimente:

cat OLD.log | perl -nle 'print if index($_,q[string]) != 0 and
index($_,q[string2]) != -1' > NEW.log

(q pode ser reduzida pra isso, a gosto do freguês):

cat OLD.log | perl -nle 'print if index($_,q[string]) and
index($_,q[string2]) != -1' > NEW.log

index(string, substring) retorna o índice da substring dentro de $_
(começando por 0) e retorna -1 se a string nao for encontrada. No
código acima, estamos imprimindo apenas se "string" não estiver no
início e "string2" não estiver na frase.

Se quiser brincar, podemos também voltar à expressões regulares e
tentar estudar o escalar antes de aplicar a ER:

cat OLD.log | perl -nle 'study; print if !/^string1|string2/' > NEW.log

cat OLD.log | perl -nle 'study; print if !/^string1/ && !/string2/' > NEW.log

como é um teste relativamente simples, não sei o ganho exato disso
(pode ser até que piore o desempenho). Outra alternativa é o //o, que
não achei na documentação mas se não me falha a memória serve pra
pré-compilar e otimizar ERs estáticas (como a sua):

cat OLD.log | perl -nle 'print if !/^string1|string2/o' > NEW.log

cat OLD.log | perl -nle 'print if !/^string1/o && !/string2/o' > NEW.log

de repente até juntar isso com o study, sei lá. Ainda aposto no
'index' pra ser o mais rápido ;-)

[]s

-b

2010/3/18 Solli Honorio <shonorio em gmail.com>:
>
> 2010/3/18 Marcos Machado <listas em istf.com.br>
>>
>> Vamos por partes:
>> Alexei, não, o objetivo é pegar começando com STR1 ou contendo STR2. Do
>> jeito que fez, acho que vai ser preciso sempre começar com STR1 ou STR2.
>> Solli, sim, o resultado é o mesmo. Se a linha não começar com STR1 e não
>> contiver STR2 ele imprime. Juntar duas negativas para dar um resultado
>> positivo é pegajoso. Realmente ficou horrível.
>
> MM é que eu não o ! , eu não estava lendo a negação ...
>
>>
>> Fernando, você está certo. A STR2 até pode começar a linha, mas não é
>> obrigatório.
>> Neilson, segundo o Eden, Seu Morgan disse que tá certo (e funcionou). :)
>
> Ok, mas ficou claro pq funcionou da segunda maneira ? É que na primeira
> maneira a regex está analisando posição por posição toda a string em todas
> as opções de comparação, ou seja ele não compra a palavra 'string1' na
> sentença 'eu nao tenho a string3', ele pega o primeiro caracter da 'string1'
> e sai comparando em toda sentença, se não achar, vai fazer o mesmo com a
> segunda opção. Eu nem consigo imaginar a quantida de vezes que ele deve ter
> feito isto no teu arquivo. O perldoc perlretut, na seção de 'Grouping
> things...' explica isto melhor ... agora vem o Edenc falando o sr. JP
> Morgan, desde quando da para confiar numa lei de um banqueiro ;D ....
>
>>
>> Eden, usei a condição na forma negada pois, como sempre, a coisa foi sendo
>> adaptada de outros testes, feitos por outras pessoas, e na hora eu nem me
>> toquei em inverter e usar um unless.
>> Como foi um job pontual, mesmo em 7 minutos já tava valendo. Só fiquei
>> curioso se podia melhorar, já que logo apareceram os bacalhoeiros do
>> awk+grep+raio+q+oparta dizendo que eram mais rápidos!
>> :P
>> Obrigado!
>> []s, MM
>>
>> Em 17 de março de 2010 21:12, Eden Cardim <edencardim em gmail.com> escreveu:
>>>
>>> 2010/3/17 Eden Cardim <edencardim em gmail.com>:
>>> > Não está errado, !/^string1/ && !/string2/ é equivalente a /^string1/
>>> > || /string2/, pelas leis de De Morgan, se não me engano, o Perl
>>> > otimiza isso (a versão sem negação é mais rápida). Falta saber porque
>>> > a preferência por expressar a condição na forma negada.
>>>
>>> Hm, parece que não otimiza, eu me lembro que tinha visto o Perl mecher
>>> em operadores short-cut rodando com -MO=Deparse, mas ele faz outra
>>> otimização, não essa.
>>>
>>> --
>>>   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/
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
> --
> "o animal satisfeito dorme". - Guimarães Rosa
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


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