2008-10-29 13 views

Respuesta

5

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

http://www.yoda.arachsys.com/csharp/stringbuilder.html

+5

Ese es un buen recordatorio de que debo editar el artículo para incluir la palabra "capacidad" "en algún lugar :) –

+12

Buen artículo, pero no responde ninguna de las preguntas. – Webveloper

+1

@JonSkeet - aún falta la capacidad de la palabra. Artículo interesante sin embargo. – flacnut

0

[editar: en el momento, la cuestión preguntó sobre StringList]

Qué quiere decir StringCollection? Esto utiliza inicialmente ArrayList vacío, por lo que la respuesta es 0. Y no tiene opción de cambiarlo. 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 vacío T[], no un ArrayList), pero se puede inicializar un tamaño conocido si es necesario (es decir, usted sabe la cantidad de datos que se puede esperar). De nuevo, la primera vez que Add a List<T> el tamaño salta a 4, luego se duplica cada vez que se llena.

+0

Creo que sí se refería a StringBuilder, nada más. –

+0

disculpa por la confusión –

+1

Ah; así que una buena respuesta a una pregunta diferente ... bueno ;-( –

-1

leer escuchar sobre Stringbuilder capacity, hay una aplicación de muestra para demostrarlo también.

+1

Ese artículo vinculado se refiere a la capacidad máxima. No es la capacidad predeterminada (16). –

43

El valor por defecto de StringBuilder es de 16 caracteres (utilicé .NET Reflector para averiguar).

34

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 necesita en su StringBuilder, mejor. Mientras tanto, no es necesario asignar mucho más de lo necesario.

Normalmente utilizo la instancia de 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 usará más adelante para compilar la cadena, multiplicada por el tamaño necesario para cada elemento de 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.

+3

Esta debería ser realmente la respuesta aceptada –

10

Esta pregunta surgió hoy como un duplicado de otra, pero noté que una parte no fue respondida. El valor predeterminado (suponiendo que eso signifique "cuando no se creó con una cadena lo suficientemente grande como para requerirlo) es 16 como decía la gente, pero no veo nada aquí cuando debe cambiarlo.

Lo cambia cuando puede ser una optimización posible. De hecho, la elección de 16 es lo opuesto a una optimización. Optimización selecciona valores y enfoques para adaptarse particularmente a un caso particular o subconjunto de casos posibles (no a "hacer las cosas más rápido"). "Generalmente, aunque así es como solemos usar la palabra). Aquí el diseñador de la clase tuvo que lidiar con 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 fueran, menos reasignaciones se podían utilizar para cadenas más grandes.

Hay algunas razones por las que la ronda binaria (potencias enteras de dos) es probable que proporcione un mejor rendimiento que otros números en ciertos casos, así que optaron por una de ellas, pero aparte de la opción entre 4 o 16 o 1024 era una cuestión de equilibrar diferentes valores probables.

Alguien usandoStringBuilder en lugar de diseñarlo, puede tener una mejor idea de qué tamaño son propensos a necesitar.

Si van a Append 5 números de 1 dígito, junto con cuerdas por un total de 43 caracteres de longitud, la longitud total de la StringBuilder va a ser de 48 caracteres no importa qué, por lo que debe utilizar 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 ser de cualquier longitud entre aproximadamente 23 y 34 caracteres, deben usar 34.

Si están haciendo algo en el que habrá probablemente nunca ser más de 60 caracteres, pero de vez y luego 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 que lo haga).

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

1

se encuentra la capacidad de uso de la propiedad de la capacidad de la clase StringBuilder:

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

Aquí capacidad define la capacidad por defecto de StringBuilder.

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

0

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

Así que no hay que preocuparse por el almacenamiento de la respuesta larga !!!

+0

¿Puede agregar un enlace a la documentación donde esto se confirma? –

+0

Lo he intentado en mi proyecto. Si quieres probar, puedes practicarlo en dotnetfiddle.net. –