Domanda

Quando stavo guardando Assemblee .NET decompilato per vedere alcuni interni, ho notato una classe StringBuilderCache interessante utilizzata da più metodi di framework:

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;
    }
}
.

Utilizzo di esempio Possiamo trovare ad esempio nel metodo string.Format:

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);
}
.

Mentre è abbastanza intelligente e di sicuro ricordo di tale modello di caching, mi chiedo perché MAX_BUILDER_SIZE sia così piccolo?Imposandolo, impostiamo 2kb, non sarebbe meglio?Impedirebbe alla creazione di istanze più grandi StringBuilder con un piccolo piccolo memory.

È stato utile?

Soluzione

È una cache per filettatura, quindi è previsto un numero basso.Meglio usare il sorgente di riferimento per domande come questa, vedrai anche i commenti.Sembra (modificato per adattarsi):

    // 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 Designer" è un po 'sconcertante.Bene, non proprio, sicuramente questo lavoro è stato fatto per ottimizzare Visual Studio.Neelie Kroes avrebbe una giornata di campo e l'UE avrebbe avuto un altro miliardo di dollari se avrebbe scoperto :)

Altri suggerimenti

La maggior parte delle corde costruite sono probabilmente piccole, quindi l'utilizzo di una dimensione del buffer relativamente ridotta coprirà la maggior parte delle operazioni mentre non si utilizza troppo memoria.Considera che c'è un pool filo con forse molti thread che vengono creati.Se ognuno di loro richiederebbe fino a 2kb per un buffer memorizzato nella cache, aggiungerebbe una quantità di memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top