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