StringBuilder vs String


Hoy, he tenido la oportunidad de compartir el día con verdaderos profesionales del software. Y digo he tenido la suerte porque he podido aprender muchísimo. Una de las cosas que me han dicho, me ha llamado la atención y he decidido dejarla recogida en mi blog para que, esta curiosidad-buenas prácticas-mejora de rendimiento, os sirva para todos.

Todo ha venido por la costumbre, muy habitual, de concatenar muchos String para crear una cadena de mayor tamaño en función de valores de variables o parámetros. Habitualmente, la manera que había venido utilizando yo y seguro que muchos de vosotros, era la siguiente:

string cadena += "probando"
               + "es una prueba"
               + DateTime.Now.ToString()
               + "seguimos probando"
               + (2+3).ToString()
               + "Final de la prueba" 

Como os decía seguro que habéis, o al menos yo lo hacía hasta hoy, usado esta forma de concatenar cadenas. El problema es que un String en el Framework .NET representa a una cadena inmutable. Esto significa que cada vez que la cadena original se modifica, la representación original de la cadena en memoria se destruye y se crea una nueva cadena. Esto supone una serie de operaciones de asignación y liberación de memoria. Aunque estas operaciones puedan no dar una imagen de pérdida de rendimiento en algunos escenarios. Si es cierto que supone una intervención adicional del gestor de memoría.

Para resolver esto podemos usar la clase StringBuilder. La característica principal de un StringBuilder es que mantiene su propio buffer. Cualquiera que sea la operación que pueda suponer un cambio en el tamaño de la cadena, lo primero que hace la clase es comprobar si el buffer tiene el suficiente tamaño para contener la nueva cadena, si llegado el caso, es necesario, amplia el buffer para contener la cadena modificada.

La diferencia por tanto radica fundamentalmente entonces en que cada operación con la concatenación “tradicional”, requiere que se cree una nueva cadena, mientras que con StringBuilder se usa siempre el mismo buffer.

Os dejo el mismo código anterior pero usando StringBuilder:

     StringBuilder cadena = new StringBuilder();
     cadena.Append("es una prueba");
     cadena.Append(DateTime.Now.ToString());
     cadena.Append("seguimos probando");
     cadena.Append((2+3).ToString());
     cadena.Append("Final de la prueba"); 

Y os dejo un enlace de MSDN, donde se explica todo este concepto muy detalladamente:

http://msdn.microsoft.com/en-us/library/aa302329.aspx

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s