Cómo mejorar el rendimiento de la concatenación de cadenas en Visual C#

Seleccione idioma Seleccione idioma
Id. de artículo: 306822 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E306822
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se muestran las ventajas de utilizar la clase StringBuilder con respecto a las técnicas tradicionales de concatenación. Las cadenas de .NET Framework son no variantes (es decir, el texto al que se hace referencia es de sólo lectura después de la asignación inicial). Esto proporciona muchas ventajas de rendimiento y plantea algunos retos para el programador que está acostumbrado a las técnicas de manipulación de cadenas de C/C++.

Descripción de las cadenas en .NET Framework

Una técnica para mejorar la concatenación de cadenas con respecto a strcat() en Visual C/C++ consiste en asignar una matriz grande de caracteres como un búfer y copiar los datos de la cadena al búfer. En .NET Framework, una cadena es inmutable; no se puede modificar en contexto. El operador de concatenación + de C# genera una cadena nueva y reduce el rendimiento cuando concatena grandes cantidades de texto.

Sin embargo, .NET Framework incluye una clase StringBuilder optimizada para la concatenación de cadenas. Ofrece las mismas ventajas que el uso de una matriz de caracteres en C/C++, además de aumentar automáticamente el tamaño del búfer (si es necesario) y hacer un seguimiento de su longitud. En la aplicación de ejemplo de este artículo se muestra el uso de la clase StringBuilder y se compara el rendimiento con respecto a la concatenación.

Generar y ejecutar una aplicación de demostración

  1. Inicie Visual Studio .NET o Visual Studio 2005 y cree una nueva aplicación de consola de Visual C#.
  2. En el código siguiente se utiliza el operador de concatenación += y la clase StringBuilder para realizar 5000 concatenaciones de 30 caracteres cada una. Agregue este código al procedimiento principal.
     const int sLen=30, Loops=5000; DateTime sTime, eTime; int i; string sSource = new String('X', sLen); string sDest = ""; // // Tiempo para la concatenación de cadenas. // sTime = DateTime.Now; for(i=0;i<Loops;i++) sDest += sSource; eTime = DateTime.Now; Console.WriteLine("La concatenación tardó " + (eTime - sTime).TotalSeconds + " segundos."); // // 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("El Generador de cadenas tardó " + (eTime - sTime).TotalSeconds + " segundos."); // // Hacer que la ventana de consola permanezca // abierta de forma que pueda ver el resultado cuando la ejecute desde el IDE. // Console.WriteLine(); Console.Write("Presione ENTRAR para terminar ... "); Console.Read(); 
  3. Guarde la aplicación. Presione F5 para compilar y ejecutar la aplicación. Las ventanas de consola deben mostrar un resultado similar al siguiente:
    La concatenación tardó 6,208928 segundos.
    El Generador de cadenas tardó 0 segundos.

    Presione ENTRAR para terminar ...
  4. Presione ENTRAR para dejar de ejecutar la aplicación y cerrar la ventana Consola.

Solucionar problemas

  • Si está en un entorno que acepta las secuencias de datos, como en un formulario Web Form ASPX, o si su aplicación escribe datos en disco, considere la posibilidad de evitar la sobrecarga de búfer que supone la concatenación o StringBuilder, y escriba los datos directamente en la secuencia mediante el método Response.Write o el método apropiado para la secuencia en cuestión.
  • Pruebe a reutilizar la clase StringBuilder existente en lugar de volver a asignarla cada vez que la necesite. Esto limita el crecimiento del montón y reduce la recolección de elementos no utilizados. En cualquier caso, el uso de la clase StringBuilder hace un uso más eficiente del montón que el operador +.

Referencias

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

Propiedades

Id. de artículo: 306822 - Última revisión: miércoles, 04 de octubre de 2006 - Versión: 2.4
La información de este artículo se refiere a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
Palabras clave: 
kbhowtomaster kbperformance KB306822

Enviar comentarios

 

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