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