practices example best c# .net stringbuilder capacity

c# - example - Capacidad predeterminada de StringBuilder



stringbuilder list c# (8)

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

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



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


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

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

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



Esta pregunta surgió hoy como un duplicado de otra, pero noto que una parte no fue respondida. El valor predeterminado (suponiendo que eso signifique "cuando no se crea con una cadena lo suficientemente grande como para requerirlo") es 16, como dicen las personas, pero no veo nada aquí cuando debe 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. La optimización consiste en elegir valores y enfoques que se adapten particularmente bien a un caso o subconjunto particular de casos posibles (no a "hacer las cosas más rápido" en general, aunque así es como solemos utilizar la palabra). Aquí el diseñador de la clase tuvo que lidiar con la generalización , eligiendo valores y enfoques para dar 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 manejar cadenas más grandes.

Hay algunas razones por las que la ronda binaria (poderes completos de dos) es probable que proporcione un mejor rendimiento que otros números en ciertos casos, por lo que optaron por una de ellas, pero aparte de eso, la elección entre 4 o 16 o 1024 era una cuestión de equilibrando diferentes valores probables.

Alguien que use StringBuilder lugar de diseñarlo, puede tener una mejor idea del tamaño que es probable que necesite.

Si van a Append 5 números de 1 dígito junto con cadenas de un total de 43 caracteres, la longitud total de StringBuilder será de 48 caracteres, así que deben usar una capacidad de 48, ya que 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 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 donde lo haces).

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


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

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

Aquí la capacidad define la capacidad predeterminada de StringBuilder .

StringBuilder es Max Capacity es igual que el valor máximo de Int32 .


El valor predeterminado es 16, que parece ser la capacidad predeterminada de cualquier tipo de matriz o lista en el marco .NET. Cuanta menos reasignaciones necesites en tu StringBuilder, mejor. Mientras tanto, no es necesario asignar mucho más de lo necesario.

Usualmente instancia el StringBuilder con algún tipo de estimación aproximada del tamaño final de StringBuilder. Por ejemplo, esto podría basarse en un recuento de iteraciones que utilizará 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 interna de StringBuilder se reasigna al doble de su tamaño actual.


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

¡Así que no hay que preocuparse por almacenar una respuesta larga!