Usar o Visual C# para melhorar o desempenho da concatenação de cadeia de caracteres
Este artigo fornece informações sobre como melhorar o desempenho da concatenação de cadeia de caracteres no Visual C#.
Versão original do produto: Visual C#
Número de KB original: 306822
Resumo
Este artigo mostra os benefícios de usar a classe sobre técnicas StringBuilder
tradicionais de concatenação. As cadeias de caracteres no microsoft .NET Framework são invariáveis (ou seja, o texto referenciado é somente leitura após a alocação inicial). Ele oferece muitos benefícios de desempenho e coloca alguns desafios para o desenvolvedor que está acostumado com técnicas de manipulação de cadeia de caracteres C/C++.
Este artigo refere-se ao namespace System.Text
da Biblioteca de Classes .NET Framework .
Descrição das cadeias de caracteres no .NET Framework
Uma técnica para melhorar a concatenação de strcat()
cadeia de caracteres no Visual C/C++ é alocar uma grande matriz de caracteres como um buffer e copiar dados de cadeia de caracteres no buffer. No .NET Framework, uma cadeia de caracteres é imutável, não pode ser modificada no local. O operador de concatenação C# +
cria uma nova cadeia de caracteres e causa um desempenho reduzido quando concatena grandes quantidades de texto.
No entanto, o .NET Framework inclui uma StringBuilder
classe otimizada para concatenação de cadeia de caracteres. Ele fornece os mesmos benefícios que usar uma matriz de caracteres em C/C++e aumentar automaticamente o tamanho do buffer (se necessário) e acompanhar o comprimento para você. O aplicativo de exemplo neste artigo demonstra o uso da StringBuilder
classe e compara o desempenho com a concatenação.
Criar e executar um aplicativo de demonstração
Inicie o Visual Studio e crie um novo aplicativo do Console do Visual C#.
O código a seguir usa os
+=
operadores de concatenação e aStringBuilder
classe para cronometrar 5.000 concatenações de 30 caracteres cada. Adicione esse código ao procedimento main.const int sLen = 30, Loops = 5000; int i; string sSource = new String('X', sLen); string sDest = ""; // Time string concatenation. var stopwatch = System.Diagnostics.Stopwatch.StartNew(); for (i = 0; i < Loops; i++) sDest += sSource; stopwatch.Stop(); Console.WriteLine($"Concatenation took {stopwatch.ElapsedMilliseconds} ms."); // Time StringBuilder. stopwatch.Restart(); 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(); stopwatch.Stop(); Console.WriteLine($"String Builder took {stopwatch.ElapsedMilliseconds} ms."); // 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();
Salve o aplicativo. Pressione F5 para compilar e execute o aplicativo. As janelas do console devem exibir uma saída semelhante aos exemplos:
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...
Pressione ENTER para parar de executar o aplicativo e fechar a janela do console.
Solução de problemas
Se você estiver em um ambiente compatível com o streaming dos dados, como em um Formulário Web ASPX ou seu aplicativo estiver gravando os dados em disco, considere evitar a sobrecarga de buffer da concatenação ou do
StringBuilder
e escreva os dados diretamente no fluxo por meio doResponse.Write
método ou do método apropriado para o fluxo em questão.Tente reutilizar o existente
StringBuilder class
em vez de realocar cada vez que precisar de um. O que limita o crescimento do heap e reduz a coleta de lixo. Em ambos os casos, o uso daStringBuilder
classe torna o uso mais eficiente do heap do que o uso do+
operador.
Referências
A StringBuilder
classe contém muitos outros métodos para manipulação de cadeia de caracteres in-loco que não são descritos neste artigo. Para obter mais informações, pesquise StringBuilder
na Ajuda Online.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários