Pregunta

Cuando yo estaba buscando en descompilados .NETO de las asambleas para ver algunos detalles internos, me he dado cuenta de interesante StringBuilderCache clase utilizada por múltiples marco de los métodos:

internal static class StringBuilderCache
{
    [ThreadStatic]
    private static StringBuilder CachedInstance;
    private const int MAX_BUILDER_SIZE = 360;
    public static StringBuilder Acquire(int capacity = 16)
    {
        if (capacity <= 360)
        {
            StringBuilder cachedInstance = StringBuilderCache.CachedInstance;
            if (cachedInstance != null && capacity <= cachedInstance.Capacity)
            {
                StringBuilderCache.CachedInstance = null;
                cachedInstance.Clear();
                return cachedInstance;
            }
        }
        return new StringBuilder(capacity);
    }
    public static void Release(StringBuilder sb)
    {
        if (sb.Capacity <= 360)
        {
            StringBuilderCache.CachedInstance = sb;
        }
    }
    public static string GetStringAndRelease(StringBuilder sb)
    {
        string result = sb.ToString();
        StringBuilderCache.Release(sb);
        return result;
    }
}

Uso de ejemplo podemos encontrar por ejemplo en string.Format método:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    ...
    StringBuilder stringBuilder = StringBuilderCache.Acquire(format.Length + args.Length * 8);
    stringBuilder.AppendFormat(provider, format, args);
    return StringBuilderCache.GetStringAndRelease(stringBuilder);
}

Mientras que es muy inteligente y seguro que voy a recordar acerca de tales almacenamiento en caché de patrón, me pregunto por qué MAX_BUILDER_SIZE es tan pequeño?Ajuste, vamos a configurar 2kB, no sería mejor?Se impide la creación de más StringBuilder las instancias con muy poca sobrecarga de memoria.

¿Fue útil?

Solución

Es un caché por hilo para que se espera un número bajo.Lo mejor es usar el fuente de referencia Para preguntas como esta, también verá los comentarios.Que parece (editado para caber):

    // The value 360 was chosen in discussion with performance experts as a 
    // compromise between using as litle memory (per thread) as possible and 
    // still covering a large part of short-lived StringBuilder creations on 
    // the startup path of VS designers.
    private const int MAX_BUILDER_SIZE = 360;

"vs diseñadores" es un poco desconcertante.Bueno, no realmente, seguramente este trabajo se hizo para optimizar el estudio visual.Neelie Kroes tendría un día de campo y la UE tendría otros mil millones de dólares si lo descubriría :)

Otros consejos

La mayoría de las cadenas construidas son probablemente pequeñas, por lo que el uso de un tamaño de búfer relativamente pequeño cubrirá la mayoría de las operaciones mientras no use demasiada memoria.Considere que hay una piscina de hilo con posiblemente muchos hilos que se están creando.Si cada uno de ellos tomaría hasta 2kb para un tampón en caché, sumaría una cantidad de memoria.

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