menú
¿Música de YouTube sin molestos comerciales? ¡Ahora es posible!
TubeFiesta es una aplicación que te permite reproducir música de YouTube como un reproductor tradicional.
Crear listas, reproducción aleatoria, repetir, y hasta exportar el video a otra pantalla.
Conocer más Ir a tfiesta.com

Strings gigantes y sus complicaciones de rendimiento

Publicado el 19/12/2013 | 867 visitas

Como es bien sabido, al trabajar con cadenas de texto en programación recurrimos al tipo string, generalmente éste nunca nos da problemas que no se puedan manejar.
A menos que necesitemos realizar operaciones como borrado y concatenación de cadenas de texto gigantes, que es cuando el conocido y famoso string nos saca la mano por rendimiento.

Lo digo por experiencia, y por eso quiero compartirlo. Hace algún tiempo tuve la necesidad de almacenar en una variable string un texto enorme, el problema no era ese, sino que este iba creciendo por medio de un ciclo y el tiempo que tardaba en hacerlo era extremadamente alto.

Fue entonces cuando conocí la clase StringBuilder que nos permite trabajar con texto a una velocidad de procesamiento increíblemente diferente y mejor a la de un string común.

Como me gusta, haremos un ejemplo, o más que eso, un experimento para que se den cuenta de lo que hablo.

Experimento String vs StringBuilder

Vamos a crear un programa que arme una cadena que contiene 15.000 veces "hola eledwin.com". Esto lo haremos por medio del ciclo for. Pero haremos dos métodos que hagan esto, uno con string y otro con StringBuilder, e imprimiremos un mensaje indicando el tiempo que se demoró en realizar el proceso. Veamos el código:

Creamos el método ConString() que realizará el proceso anteriormente mencionado, almacenará en una variable de tipo string y la retornará.

private string ConString()
{
    string cadenaGrande = "";
    for (int i = 0; i < 15000; i++)
    {
        cadenaGrande += "hola eledwin.com";
    }
    return cadenaGrande;
}

Ahora crearemos el método ConStringBuilder que realizará el mismo procedimiento pero esta vez irá almacenando lo procesado en una variable de tipo StringBuilder.

private string ConStringBuilder()
{
    StringBuilder cadenaGrande = new StringBuilder();
    for (int i = 0; i < 15000; i++)
    {
        cadenaGrande.Append("hola eledwin.com");
    }
    return cadenaGrande.ToString();
}

No necesitan ser expertos para notar la diferencia.

Ahora vamos a llamar estos métodos y a medir en segundos cuanto tardan en ejecutarse y devolver el resultado.

private void Ejecutar()
{
    DateTime fechaInicial = DateTime.Now;
    string cadenaGrande = ConString(); //Probaremos primero llamando a ConString() y luego a ConStringBuilder()
    double segundos = DateTime.Now.Subtract(fechaInicial).TotalSeconds;
    MessageBox.Show(string.Format("Se demoró {0} segundos, {1} caracteres concatenados!", segundos, cadenaGrande.Length));
}

Ahora vamos a correr esto y observemos los resultados

Prueba con string:

experimento stringbuilder eledwin

Prueba con StringBuilder:

experimento stringbuilder eledwin

Es obviamente notable la diferencia de tiempos. Si capturamos los resultados de StringBuilder en milisegundos ni siquiera supera el milisegundo, es decir, con StringBuilder el proceso dura menos de un milisegundo, a diferencia de el tipo string que se demora más de 4 segundos. Y eso, con tan solo 240.000 caracteres.

Eso es todo amigos, si quieren conocer un poco más de string builder visiten MSDN, vale la pena conocer más.

Si quieren descargar el código del experimento pues descarguenlo aquí:

eledwin_strings.zip (VS 2010 Framework 4.5)

Talvez te interese...

Tutorial de sockets en c# con ejemplos - Parte 2 - UDP
Tutorial de sockets en c# con ejemplos - Parte 1
[solución] No puede obtener acceso a la página solicitada debido a la configuración de la extensión
[solución] El proveedor de almacenamiento especificado no se encuentra en la configuración
blog comments powered by Disqus