Uso de Visual C# para mejorar el rendimiento de concatenación de cadenas

En este artículo se proporciona información sobre cómo mejorar el rendimiento de la concatenación de cadenas en Visual C#.

Versión original del producto: Visual C#
Número de KB original: 306822

Resumen

En este artículo se muestran las ventajas de usar la StringBuilder clase sobre las técnicas de concatenación tradicionales. Las cadenas de Microsoft .NET Framework son invariables (es decir, el texto al que se hace referencia es de solo lectura después de la asignación inicial). Proporciona muchas ventajas de rendimiento y supone algunos desafíos para el desarrollador que está acostumbrado a las técnicas de manipulación de cadenas de C/C++.

En este artículo se hace referencia al espacio de nombres System.Textbiblioteca de clases de .NET Framework .

Descripción de las cadenas en .NET Framework

Una técnica para mejorar la concatenación strcat() de cadenas en Visual C/C++ es asignar una matriz de caracteres de gran tamaño como búfer y copiar datos de cadena en el búfer. En .NET Framework, una cadena es inmutable, no se puede modificar en su lugar. El operador de concatenación de C# + compila una nueva cadena y provoca un rendimiento reducido cuando concatena grandes cantidades de texto.

Sin embargo, .NET Framework incluye una StringBuilder clase optimizada para la concatenación de cadenas. Proporciona las mismas ventajas que el uso de una matriz de caracteres en C/C++, y el crecimiento automático del tamaño del búfer (si es necesario) y el seguimiento de la longitud automáticamente. La aplicación de ejemplo de este artículo muestra el uso de la StringBuilder clase y compara el rendimiento con la concatenación.

Compilación y ejecución de una aplicación de demostración

  1. Inicie Visual Studio y, a continuación, cree una nueva aplicación de consola de Visual C#.

  2. El código siguiente usa los += operadores de concatenación y la StringBuilder clase para time 5000 concatenaciones de 30 caracteres cada una. Agregue este código al procedimiento principal.

    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. Guarde la aplicación. Presione F5 para compilar y, a continuación, ejecutar la aplicación. Las ventanas de consola deben mostrar una salida similar a la de los ejemplos:

    Concatenation took 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. Presione ENTRAR para detener la ejecución de la aplicación y cerrar la ventana de la consola.

Solución de problemas

  • Si se encuentra en un entorno que admite el streaming de los datos, como en un formulario web ASPX o la aplicación está escribiendo los datos en el disco, considere la posibilidad de evitar la sobrecarga del búfer de concatenación StringBuildero , y escribir los datos directamente en la secuencia a través del Response.Write método o el método adecuado para la secuencia en cuestión.

  • Intente reutilizar el existente StringBuilder class en lugar de reasignar cada vez que necesite uno. Lo que limita el crecimiento del montón y reduce la recolección de elementos no utilizados. En cualquier caso, el uso de la StringBuilder clase hace un uso más eficaz del montón que el uso del + operador .

Referencias

La StringBuilder clase contiene muchos otros métodos para la manipulación de cadenas local que no se describen en este artículo. Para obtener más información, busque StringBuilder en la Ayuda en línea.