-----Original Message-----
From: Bruno F. Souza <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Date: Friday, December 17, 1999 1:51 PM
Subject: Re: [SouJava-J] Comaparacao de Strings
"Paulo S. L. M. Barreto" wrote:
>
> Uma alternativa geralmente mais eficiente é usar:
>
> if (str1.intern() == str2.intern()) {
> /* ... */
> }
>
> já que é feita apenas uma comparação de endereços, e não de conteúdo.
> Obviamente é melhor invocar o método intern() uma só vez e trabalhar
apenas
> com o resultado.
>
> Paulo.
>Portanto, o processo acima so eh valido se essa comparacao
>entre dois valores de String for ser feita repetidas vezes,
>o que _em geral_ nao eh o caso nas aplicacoes.
É como você disse: depende do "geralmente". Recentemente desenvolvi um
gerador de compiladores, e essa é uma situação típica onde há muitas
comparações (tipicamente da ordem de 10000 a 50000) entre um número não
muito grande de strings (tipicamente da ordem de 250, e mesmo para
gramáticas grandes é raro serem mais de 500, cada uma com menos de 10
caracteres em média). Nessas circunstâncias é vantajoso tabelar cada string
usando intern (uma única vez, como eu disse). O uso de intern nesse tipo de
aplicação acelera o processo de meta-compilação por um fator 6.
Concordo, evidentemente, que isso não é uma aplicação comum, e eu jamais
usaria intern antes de analisar o impacto das comparações sobre o desempenho
do sistema como um todo.
>quanto mais strings voce tiver no pool, mais demorado sera
>para voce fazer um "intern" e menores sao as chances desse
>processo ser mais performatico.
Claro que a alternativa é alocar centenas de vezes a mesma string.
Uma boa implementação da JVM deveria fazer busca com hashing. Imagino que a
Sun implementa desta maneira, estarei equivocado? Assim, as buscas são
feitas em tempo praticamente constante; o tempo de realocação da tabela
sobre o tempo total de busca não deveria ultrapassar um fator 2 (o que
significa que a aplicação que citei aci
>Uma outra resalva eh nao se acostumar a usar o metodo "equals" e
>acabar esquecendo o "intern" alguma vez, e voce tera a comparacao
>errada. Portanto, utilize sempre o "equals" e, se voce identificar
>uma situacao onde duas strings sao constantemente comparadas,
>voce pode decidir usar o "intern".
Este conselho é certamente útil para programação Java básica. Contudo, a
documentação de intern não deixa claro o valor desse método num processo de
otimização (que não é, nem deve ser, a preocupação normal de um
desenvolvedor, exceto em aplicações críticas), e de vez em quando é
conveniente mostrar ao desenvolvedor que ferramenta ele tem em mãos.
Só para terminar, explico o que eu tinha em mente com a palavra
"geralmente": não era o tipo de aplicação, mas a forma como se usa o
recurso. Concretamente, usar intern num único ponto (uma única comparação,
executada uma única vez) não vai nem melhorar, nem piorar a performance. O
uso de cada recurso deve ser sempre criterioso: recursos simples para
problemas simples, recursos requintados para situações mais complexas.
Paulo.
--------------------------- LISTA SOUJAVA ---------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
[para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
---------------------------------------------------------------------