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>
значения, используемого для подстановки. Это еще раз может значительно сократить количество выделений в зависимости от конкретного сценария использования.
Примеры
Дополнительные примеры можно найти в модульных тестах.
.NET Community Toolkit