当我查看反编译的 .NET 程序集以了解一些内部结构时,我注意到多个框架方法都使用了有趣的 StringBuilderCache
类:
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;
}
}
我们可以在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);
}
虽然这个缓存模式非常聪明,我一定会记住。但是我想知道为什么`MAX_BUILDER_SIZE`如此之小?将它设置为2KB是否更好?这将可以防止创建较大的`StringBuilder`实例从而减少内存开销。
虽然这个缓存模式非常聪明,我一定会记住。但是我想知道为什么MAX_BUILDER_SIZE如此之小?将它设置为2KB是否更好?这将可以防止创建较大的
StringBuilder
实例从而减少内存开销。