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

  1. Inicie o Visual Studio e crie um novo aplicativo do Console do Visual C#.

  2. O código a seguir usa os += operadores de concatenação e a StringBuilder 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();
    
  3. 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...
    
  4. 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 StringBuildere escreva os dados diretamente no fluxo por meio do Response.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 da StringBuilder 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.