Frage

Als ich mir dekompilierte .NET-Assemblys ansah, um einige Interna zu sehen, ist mir interessant aufgefallen StringBuilderCache klasse, die von Methoden mehrerer Frameworks verwendet wird:

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

Beispielverwendung finden wir zum Beispiel in string.Format Methode:

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

Obwohl es ziemlich clever ist und ich mich sicher an ein solches Caching-Muster erinnern werde, frage ich mich warum MAX_BUILDER_SIZE ist so klein?Setzen Wir es auf 2 KB, wäre das nicht besser?Es würde verhindern, dass größere StringBuilder instanzen mit einem recht geringen Speicheraufwand.

War es hilfreich?

Lösung

Es handelt sich um einen Cache pro Thread, daher wird eine niedrige Anzahl erwartet.Am besten verwenden Sie die Bezugsquelle bei Fragen wie diesen sehen Sie auch die Kommentare.Was aussieht wie (passend bearbeitet):

    // 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" ist ein bisschen rätselhaft.Nun, nicht wirklich, sicherlich wurde diese Arbeit geleistet, um Visual Studio zu optimieren.Neelie Kroes hätte einen Feldtag und die EU hätte eine weitere Milliarde Dollar, wenn sie es herausfinden würde :)

Andere Tipps

Die meisten erstellten Zeichenfolgen sind wahrscheinlich klein, sodass die Verwendung einer relativ kleinen Puffergröße die meisten Vorgänge abdeckt, ohne zu viel Speicher zu verbrauchen.Bedenken Sie, dass ein Thread-Pool mit möglicherweise vielen Threads erstellt wird.Wenn jeder von ihnen bis zu 2 KB für einen zwischengespeicherten Puffer beanspruchen würde, würde dies zu einer gewissen Speichermenge führen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top