문제

디 컴파일 된 .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 인스턴스를 생성하지 못하게합니다.

도움이 되었습니까?

해결책

스레드 별 캐시이므로 낮은 숫자가 예상됩니다. 참조 소스를 사용하는 것이 좋습니다 다음과 같은 질문에 대해서도 댓글을 볼 수 있습니다.어떤 것처럼 보입니다 (맞는 편집) :

    // 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"는 WEE BIT PURZING입니다.음, 정말로, 확실히이 작업은 Visual Studio를 최적화하기 위해 수행되었습니다.Neelie Kroes는 분야의 날을 가질 것이고 EU는 그녀가 알아낼 것입니다.)

다른 팁

대부분의 문자열이 작아지기 때문에 비교적 작은 버퍼 크기를 사용하면 너무 많은 메모리를 사용하지 않고 대부분의 작업을 다룹니다.가능한 많은 스레드가 생성되는 스레드 풀이 있음을 고려하십시오.그 중 하나가 캐시 된 버퍼에 대해 최대 2KB가 걸리면 일부 메모리가 추가됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top