StringPool

Тип StringPool реализует настраиваемый пул для string экземпляров. Это можно использовать для минимизации выделения при создании нескольких string экземпляров из буферов или byte значенийchar. Он предоставляет механизм, который несколько похож string на интернирование, с основными различиями в том, что пул настраивается, может быть сброшен с помощью политики лучших усилий и не требует предварительного создания экземпляров string объектов, поэтому он может сохранять начальные выделения, а также при работе с временными буферами.

API платформы:StringPool

Синтаксис

Основной точкой входа является StringPool его GetOrAdd(ReadOnlySpan<char>) API, который возвращает string экземпляр, соответствующий содержимому входных данных ReadOnlySpan<char>, возможно, получение возвращаемого объекта из внутреннего пула.

Например, представьте, что у нас есть входные данные string , представляющие URL-адрес заданного веб-запроса, и мы хотим также получить string только имя узла. Если мы получаем большое количество запросов, возможно, для небольшого количества узлов, возможно, мы хотим кэшировать эти string экземпляры, мы можем сделать это с помощью StringPool типа следующим образом:

public static string GetHost(string url)
{
    // We assume the input might start either with eg. https:// (or other prefix),
    // or directly with the host name. Furthermore, we also assume that the input
    // URL will always have a '/' character right after the host name.
    // For instance: "https://learn.microsoft.com/dotnet/api/system.string.intern".
    int
        prefixOffset = url.AsSpan().IndexOf(stackalloc char[] { ':', '/', '/' }),
        startIndex = prefixOffset == -1 ? 0 : prefixOffset + 3,
        endIndex = url.AsSpan(startIndex).IndexOf('/');

    // In this example, it would be "learn.microsoft.com"
    ReadOnlySpan<char> span = url.AsSpan(startIndex, endIndex);

    return StringPool.Shared.GetOrAdd(span);
}

Приведенный выше метод не выделяется вообще, если запрошенный string файл уже присутствует в кэше, так как подстановка выполняется как ReadOnlySpan<char> входные данные, представляющее представление по входному URL-адресу string.

Этот StringPool тип также может быть полезен при анализе необработанных запросов с помощью другой кодировки, например UTF8. GetOrAdd Существует перегрузка, которая принимает входные данные ReadOnlySpan<byte> и Encoding экземпляр, который использует временный буфер, арендованный из пула, для получения ReadOnlySpan<char> значения, используемого для подстановки. Это еще раз может значительно сократить количество выделений в зависимости от конкретного сценария использования.

Примеры

Дополнительные примеры можно найти в модульных тестах.