Question

Quand je regardais le décompilé .NET assemblées de voir certains internes, j'ai remarqué intéressant StringBuilderCache classe utilisée par plusieurs framework méthodes:

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

Exemple d'utilisation, on peut trouver par exemple dans string.Format méthode:

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

Alors qu'il est très intelligent et pour sûr que je vais retenir sur un tel modèle de mise en cache, je me demande pourquoi MAX_BUILDER_SIZE est-elle si petite?Le paramètre, nous allons définir 2kB, ne serait pas mieux?Il permettrait d'éviter de créer de plus grandes StringBuilder les instances avec un peu de surcharge de la mémoire.

Était-ce utile?

La solution

Il est par thread cache donc un faible nombre est prévu.Meilleure utilisation de la Source De Référence pour des questions de ce genre, vous allez voir les commentaires ainsi.Qui ressemble (modifié pour s'adapter):

    // 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 designers" est un tout petit peu perplexe.Eh bien, pas vraiment, assurément, ce travail a été fait pour optimiser Visual Studio.Neelie Kroes aurait une journée sur le terrain et l'UE aurait un autre milliard de dollars si elle trouverait :)

Autres conseils

La plupart des chaînes sont probablement de petits, donc à l'aide d'une relativement petite taille de mémoire tampon de couvrir la plupart des opérations, tout en n'utilisant pas trop de mémoire.Considérer qu'il y a un pool de threads avec, éventuellement, le nombre de threads en cours de création.Si chacun d'entre eux pourrait prendre jusqu'à 2 ko de cache de la mémoire tampon, ce serait ajouter jusqu'à une certaine quantité de mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top