-----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]
    ---------------------------------------------------------------------

Responder a