tanta porque mucha ejemplos consume chrome .net stringbuilder ram

.net - porque - ¿Cómo es el consumo de RAM de StringBuilder?



stringbuilder c# ejemplos (5)

Aquí hay un buen estudio sobre la concatenación de cadenas frente a la asignación de memoria .

Si puedes evitar la concatenación, ¡hazlo!

Esto es obvio, si no tiene que concatenarse pero quiere que su código fuente se vea bien, use el primer método. Se optimizará como si fuera una sola cadena.

No use + = concatenación nunca. Demasiados cambios están ocurriendo detrás de la escena, que no son obvios desde mi código en primer lugar. Aconsejo usar String.Concat () explícitamente con cualquier sobrecarga (2 cadenas, 3 cadenas, matriz de cadenas). Esto mostrará claramente lo que hace su código sin sorpresas, mientras se permite controlar la eficiencia.

Intenta estimar el tamaño objetivo de un StringBuilder.

Cuanto más exacto pueda estimar el tamaño necesario, menos cadenas temporales tendrá que crear StringBuilder para aumentar su búfer interno.

No use ningún método Format () cuando el rendimiento sea un problema.

Demasiada sobrecarga involucra el análisis del formato, cuando puede construir una matriz de piezas cuando todo lo que está usando es {x} reemplaza. Format () es bueno para la legibilidad, pero es una de las cosas a las que debe ir cuando exprime todo el rendimiento posible de su aplicación.

Tenemos algunas operaciones en las que estamos haciendo una gran cantidad de concatenaciones de cadenas de gran tamaño, y hemos encontrado recientemente una excepción de falta de memoria. Desafortunadamente, la depuración del código no es una opción, ya que esto ocurre en el sitio del cliente.

Entonces, antes de buscar una revisión de nuestro código, me gustaría preguntar: ¿cuáles son las características de consumo de RAM de StringBuilder para cadenas grandes?

Especialmente cuando se comparan con el tipo de cadena estándar. El tamaño de las cadenas supera los 10 MB, y parece que nos encontramos con problemas de alrededor de 20 MB.

NOTA : No se trata de velocidad sino de RAM.


Cada vez que StringBuilder se queda sin espacio, reasigna un nuevo búfer dos veces el tamaño del búfer original, copia los caracteres antiguos y permite que el búfer anterior obtenga GC. Es posible que solo esté utilizando lo suficiente (llámelo x) de modo que 2x sea más grande que la memoria que puede asignar. Es posible que desee determinar la longitud máxima de sus cadenas y pasarla al constructor de StringBuilder para que realice una asignación previa, y no estará a merced de la reasignación duplicada.


No sé exactamente el patrón de memoria del generador de cadenas, pero la cadena común no es una opción.

Cuando utiliza la cadena común, cada concatenación crea otro par de objetos de cadena, y el consumo de memoria se dispara, haciendo que el recolector de basura se llame con demasiada frecuencia.

string a = "a"; //creates object with a a += "b" /creates object with b, creates object with ab, assings object with ab to "a" pointer


Strigbuilder es una solución perfectamente buena para los problemas de memoria causados ​​por la concatenación de cadenas.

Para responder a su pregunta específica, Stringbuilder tiene una sobrecarga de tamaño constante en comparación con una cadena normal donde la longitud de la cadena es igual a la longitud del búfer Stringbuilder actualmente asignado. El búfer podría tener el doble del tamaño de la cadena resultante, pero no se realizarán más asignaciones de memoria al concatenar al Stringbuilder hasta que se llene el búfer, por lo que es realmente una excelente solución.

Comparado con la cuerda, esto es sobresaliente.

string output = "Test"; output += ", printed on " + datePrinted.ToString(); output += ", verified by " + verificationName; output += ", number lines: " + numberLines.ToString();

Este código tiene cuatro cadenas que se almacenan como literales en el código, dos que se crean en los métodos y una de una variable, pero usa seis cadenas intermedias separadas que se hacen cada vez más largas. Si este patrón continúa, aumentará el uso de la memoria a una velocidad exponencial hasta que el GC entre en acción para limpiarlo.


Puede que le interese la estructura de datos de las cuerdas. Este artículo: Cuerdas: la teoría y la práctica explican sus ventajas. Tal vez hay una implementación para .NET.

[Actualizar, para responder al comentario] ¿Utiliza menos memoria? Memoria de búsqueda en el artículo, encontrará algunos consejos.
Básicamente, sí, a pesar de la sobrecarga de la estructura, porque simplemente agrega memoria cuando es necesario. StringBuilder, al agotar el búfer antiguo, debe asignar uno mucho más grande (que ya puede desperdiciar la memoria vacía) y descartar el anterior (que será basura recolectada, pero aún puede usar mucha memoria mientras tanto).

No he encontrado una implementación para .NET, pero hay al menos una implementación de C ++ (en STL de SGI: http://www.sgi.com/tech/stl/Rope.html ). Quizás puedas aprovechar esta implementación. Tenga en cuenta que la página que menciono tiene un trabajo sobre el rendimiento de la memoria.

Tenga en cuenta que las cuerdas no son la solución a todos los problemas: su utilidad depende en gran medida de cómo construya sus cadenas grandes y cómo las use. Los artículos señalan ventajas y desventajas.