La comprensión de .RED interna StringBuilderCache de configuración de clase
-
21-12-2019 - |
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.
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.