Cómo mejorar el rendimiento de la concatenación de cadenas en Visual Basic .NET o Visual Basic 2005

Para una versión de Microsoft Visual C# .NET de este artículo, consulte
306822 .
Para obtener una versión de Microsoft Visual Basic 6.0 de este artículo, consulte
170964 .

EN ESTA TAREA

Resumen

En este artículo se demuestra las ventajas de utilizar la clase StringBuilder respecto a las técnicas tradicionales de concatenación. Cadenas en el.NET Framework son invariables (es decir, el texto 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 versiones anteriores de Visual Basic. Una técnica común de concatenación de cadenas de Visual Basic 6.0 puede ser hasta 1.000 veces más rápida que el & operador, sin embargo, esta técnica proporciona ninguna ventaja de rendimiento en Visual Basic .NET o Visual Basic 2005.

Descripción de las cadenas en el.NET Framework

Una técnica para mejorar la concatenación de cadenas en Visual Basic 6.0 y versiones anteriores era asignar un búfer de cadenas grande y utilizar la instrucción Mid para copiar datos de cadena en el búfer. Esta técnica se ilustra en el siguiente artículo de Microsoft Knowledge Base:
170964 cómo mejorar el rendimiento de la concatenación de cadenas
En el.NET Framework, una cadena es inmutable; no pueda modificarse en el lugar, a diferencia de las cadenas en versiones anteriores de Visual Basic. En su lugar, cualquier modificación en una cadena en el.NET Framework producen una nueva cadena que se asignará. Visual Basic .NET sigue incluyendo una instrucción Mid, pero su implementación utiliza la concatenación para generar la nueva cadena en lugar de modificar el contenido de la cadena en su lugar. Como resultado, la técnica que se describe en
170964 no mejora el rendimiento de la concatenación de cadenas en Visual Basic .NET.

El.NET Framework incluye una clase StringBuilder está optimizada para la concatenación de cadenas. Proporciona las mismas ventajas que utilizar la instrucción Mid en versiones anteriores de Visual Basic, así como aumentar automáticamente el tamaño del búfer (si es necesario) y seguimiento de la longitud para usted. La aplicación de ejemplo en este artículo se muestra cómo utilizar la clase StringBuilder y compara el rendimiento de 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 Basic.
  2. El siguiente código 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 Sub Main.
    Const sLen = 30, Loops = 5000Dim sTime, eTime As DateTime, I As Integer
    Dim sSource As New String("X"c, sLen)
    Dim sDest As String = ""
    '
    ' Time string concatenation
    '
    sTime = Now
    For I = 1 To Loops
    sDest &= sSource
    Next I
    eTime = Now
    Console.WriteLine("Concatenation took " & eTime.Subtract(sTime).TotalSeconds & " seconds.")
    '
    ' Time StringBuilder
    '
    sTime = Now
    ' Initialize the StringBuilder buffer slightly larger
    ' than what you expect to need.
    Dim sb As New Text.StringBuilder(CInt(sLen * Loops * 1.1))
    For I = 1 To Loops
    sb.Append(sSource)
    Next I
    sDest = sb.ToString()
    eTime = Now
    Console.WriteLine("String Builder took " & eTime.Subtract(sTime).TotalSeconds & " seconds.")
    '
    ' Make the console window stay open so that you can
    ' see the results when you are running from the IDE.
    '
    Console.WriteLine()
    Console.Write("Press ENTER to finish ... ")
    Console.Read()

  3. Guarde la aplicación y presione la tecla F5 para compilar y ejecutar la aplicación. Las ventanas de consola deben mostrar un resultado similar al siguiente:
    Concatenation took 6.208928 seconds.
    String Builder took 0 seconds.

    Press ENTER to finish ...

  4. Presione ENTRAR para detener la ejecución de la aplicación y cerrar la ventana de consola.

Solución de problemas

  • Si está en un entorno que admite la transmisión de los datos, como en un formulario ASPX Web Form o su aplicación escribe datos en disco, considere la posibilidad de evitar la sobrecarga del búfer de concatenación o StringBuildery 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 reasignarla cada vez que necesite uno. Esto limita el crecimiento del montón y reduce la recolección. En cualquier caso, utilizar 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, busque "StringBuilder" en la Ayuda en línea.

Propiedades

Id. de artículo: 306821 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios