Você está offline; aguardando reconexão

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

Este artigo foi publicado anteriormente em BR306822
Este artigo descreve uma versão beta de um produto Microsoft. Estas informações são fornecidas no estado em que se encontram e estão sujeitas a alterações sem aviso prévio.

Não existe suporte formal ao produto disponível por parte da Microsoft para este produto beta. Para obter informações sobre o suporte a uma versão beta, consulte a documentação incluída nos arquivos do produto beta ou consulte o site de onde foi feito o download da versão.Para obter uma versão deste documento no Microsoft Visual Basic .NET, consulte o artigo BR306821.

NESTA TAREFA

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

voltar ao início

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.

voltar ao início

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.
voltar ao início

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.
voltar ao início

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.

voltar ao início















Propriedades

ID do Artigo: 306822 - Última Revisão: 04/09/2003 15:55:00 - Revisão: 1.0

Microsoft Visual C# .NET 2002 Standard Edition

  • kbhowto kbhowtomaster KB306822
Comentários