PROCEDIMENTOS: Melhorar o desempenho da concatenação de seqüências de caracteres no Visual C# .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 306822 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi publicado anteriormente em BR306822
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo demonstra as vantagens do uso da classe StringBuilder em relação às técnicas de concatenação. As seqüências de caracteres do .NET Framework não são variáveis (ou seja, o texto referido é somente leitura após a alocação inicial). Isso oferece várias vantagens de desempenho e propõe alguns desafios ao desenvolvedor que está acostumado com as técnicas de manipulação de seqüência de caracteres do C/C++.

Descrição das seqüências de caracteres no .NET Framework

Um técnica para melhorar a concatenação de seqüência de caracteres em relação ao strcat() no Visual C/C++ é alocar uma matriz de caractere grande como um buffer e copiar a seqüência de caracteres para o buffer. No .NET Framework, uma seqüência de caracteres é imutável. Ela não pode ser modificada in-loco. O operador de concatenação + de C# cria uma nova seqüência e faz com que o desempenho seja reduzido quando concatena grandes quantidades de texto.

No entanto, o .NET Framework inclui uma classe StringBuilder que é otimizada para fins de concatenação de seqüência de caracteres. Ele oferece as mesmas vantagens oferecidas pelo uso de uma matriz de caractere em C/C++, bem como o crescimento automático do buffer (se necessário) e o controle do tamanho para você. O aplicativo de exemplo deste artigo mostra as vantagens do uso da classe StringBuilder e compara o desempenho em relação à concatenação.

Criar e executar um aplicativo de demonstração

  1. Inicie o Visual Studio .NET e crie um novo aplicativo de console do Visual C#.
  2. O código a seguir usa o operador de concatenação += e a classe StringBuilder para temporizar as 5.000 concatenações de 30 caracteres cada uma. Adicione esse código ao procedimento principal.
    const int sLen=30, Loops=5000;
    DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    // 
    // Time string concatenation.
    // 
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // Time StringBuilder.
    // 
    sTime = DateTime.Now;
    System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
    for(i=0;i<Loops;i++) sb.Append(sSource);
    sDest = sb.ToString();
    eTime = DateTime.Now;
    Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // Make the console window stay open
    // so that you can see the results when running from the IDE.
    // 
    Console.WriteLine();
    Console.Write("Press Enter to finish ... ");
    Console.Read();
  3. Salve o aplicativo e pressione a tecla F5 para compilar e executar o aplicativo. As janelas do console deverão exibir uma saída similar à seguinte:
    Concatenation took 6.208928 seconds.
    String Builder took 0 seconds.
    
    Press ENTER to finish ...
  4. Pressione ENTER para interromper a execução do aplicativo e fechar a janela do console.

Solução de problemas

  • Se você estiver em um ambiente que ofereça suporte ao fluxo contínuo de dados, como acontece em um formulário ASPX da Web, ou seu aplicativo estiver gravando os dados no disco, recomenda-se que o usuário evite a sobrecarga de concatenação do buffer ou a classe StringBuilder, e grave os dados diretamente no fluxo contínuo através do método Response.Write ou do método apropriado para o fluxo contínuo em questão.
  • Tente reutilizar a classe StringBuilder existente, em vez de fazer a realocação cada vez que precisar de uma classe. Isso limita o crescimento da pilha e reduz a coleta de lixo. Em ambos os casos, o uso da classe StringBuilder torna mais eficiente o uso da pilha em relação ao uso do operador.

REFERÊNCIAS

A classe StringBuilder contém muitos outros métodos para a manipulação de seqüência de caracteres in-loco que não estão descritos neste artigo. Para obter mais informações, procure por "StringBuilder" na Ajuda on-line.

















Propriedades

ID do artigo: 306822 - Última revisão: quarta-feira, 9 de abril de 2003 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbhowto kbhowtomaster KB306822

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com