Pregunta

¿Cuál es la capacidad predeterminada de un StringBuilder?

¿Y cuándo debería (o no debería) usarse el predeterminado?

¿Fue útil?

Solución

El Venerable J. Skeet ha proporcionado un buen análisis de precisamente este problema:

https://jonskeet.uk/csharp/stringbuilder.html

Otros consejos

La capacidad predeterminada de StringBuilder es de 16 caracteres (utilicé .NET Reflector para averiguarlo).

El valor predeterminado es 16, que parece ser la capacidad predeterminada de cualquier tipo de matriz o lista en el marco .NET. Cuantas menos reasignaciones necesite en su StringBuilder, mejor será. Mientras tanto, también es innecesario asignar mucho más de lo necesario.

Por lo general, ejemplifico el StringBuilder con algún tipo de estimación aproximada del tamaño final del StringBuilder. Por ejemplo, esto podría basarse en un recuento de iteraciones que usará más adelante para construir la cadena, multiplicado por el tamaño necesario para cada elemento en esta iteración.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

Cuando el tamaño de un StringBuilder es demasiado pequeño para escribir la siguiente cadena, la matriz de caracteres internos de StringBuilder se reasigna al doble de su tamaño actual.

Esta pregunta surgió hoy como un duplicado de otra, pero noté que una parte no fue respondida. El valor predeterminado (suponiendo que significa & Quot; cuando no se crea con una cadena que sea lo suficientemente grande como para requerir) es 16 como dijeron las personas, pero no veo nada aquí sobre cuándo debería cambiarlo.

Lo cambia cuando puede hacerlo como una posible optimización. De hecho, la elección de 16 es lo opuesto a una optimización. Optimización es elegir valores y enfoques para adaptarse particularmente bien a un caso particular o subconjunto de casos posibles, (no & "; hacer las cosas más rápido &"; en general, aunque así es como a menudo usa la palabra). Aquí, el diseñador de la clase tuvo que ocuparse de la generalización , seleccionando valores y enfoques para proporcionar un rendimiento razonablemente bueno en una amplia gama de casos.

Cuanto más pequeños fueron, menos uso de memoria.

Cuanto más grandes fueron, menos reasignación para tratar con cadenas más grandes.

Hay algunas razones por las cuales es probable que las rondas binarias (potencias enteras de dos) den un mejor rendimiento que otros números en ciertos casos, por lo que optaron por uno de esos, pero aparte de eso, la elección entre 4 o 16 o 1024 fue una cuestión de equilibrar diferentes valores probables.

Alguien que usa StringBuilder en lugar de diseñarlo, puede tener una mejor idea de qué tamaño es probable que necesite.

Si van a Append 5 números de 1 dígito junto con cadenas que suman un total de 43 caracteres de longitud, entonces la longitud total de <=> será de 48 caracteres sin importar qué, entonces deberían usar una capacidad de 48 como 48 es siempre el tamaño más eficiente para una cadena de 48 de longitud.

Si están haciendo algo donde podría haber una longitud de entre 23 y 34 caracteres, deberían usar 34.

Si están haciendo algo donde probablemente nunca habrá más de 60 caracteres, pero de vez en cuando podría haber, deberían usar 64 (no reasignar para la mayoría de las partes y obtener el beneficio de poder de dos mencionado anteriormente para los pocos casos en los que lo hace).

Si es imposible llegar a una conclusión sobre esto, o al menos difícil hacerlo y no es un punto crítico de rendimiento, entonces debería usar el valor predeterminado.

Podemos encontrar la capacidad utilizando la propiedad de capacidad de la StringBuilder Clase:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

Aquí la capacidad define la capacidad predeterminada de Max Capacity.

Int32 es <=> es el mismo que el valor máximo de <=>.

[edit: en ese momento, la pregunta sobre StringList]

¿Te refieres a StringCollection? Esto utiliza un ArrayList vacío inicialmente, por lo que la respuesta es 0. Y no tiene ninguna opción para cambiarlo. Cuando agrega un elemento por primera vez, la capacidad salta a 4, luego utiliza una estrategia de duplicación cuando se llena.

Si quiere decir List<string>, entonces es similar (un T[] vacío, no un Add), pero puede inicializar un tamaño conocido si lo necesita (es decir, sabe cuántos datos espera). Nuevamente, la primera vez que List<T> a <=> el tamaño salta a 4, luego se duplica cada vez que se llena.

La capacidad predeterminada de un String-Builder es 16 caracteres , Y la capacidad máxima de String-Builder es 2147483647 caracteres .

¡¡Así que no debes preocuparte por almacenar una respuesta larga !!!

leer escuchar acerca de Capacidad de Stringbuilder , hay una aplicación de muestra para probarlo también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top