Pula ciągów
Typ StringPool implementuje konfigurowalną pulę dla string
wystąpień. Może to służyć do zminimalizowania alokacji podczas tworzenia wielu string
wystąpień z char
lub byte
wartości. Zapewnia mechanizm, który jest nieco podobny do string
interningu, z główną różnicą polegającą na tym, że pula jest konfigurowalna, można zresetować, jest implementowana przy użyciu zasad najlepszego nakładu pracy i nie wymaga wstępnego tworzenia wystąpień string
obiektów, dzięki czemu może zapisywać początkowe alokacje, a także podczas pracy z tymczasowymi.
Interfejsy API platformy: StringPool
Składnia
Głównym punktem StringPool
wejścia jest jego GetOrAdd(ReadOnlySpan<char>)
interfejs API, który zwraca wystąpienie zgodne z zawartością string
danych wejściowych ReadOnlySpan<char>
, prawdopodobnie uzyskanie zwróconego obiektu z puli wewnętrznej.
Załóżmy na przykład, że mamy dane wejściowe string
reprezentujące adres URL danego żądania internetowego i chcemy również pobrać string
element z nazwą hosta. Jeśli uzyskamy dużą liczbę żądań dla niewielkiej liczby hostów, możemy chcieć buforować te string
wystąpienia, możemy to zrobić przy użyciu StringPool
typu w następujący sposób:
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);
}
W powyższej metodzie nie ma żadnych alokacji, jeśli żądany string
element znajduje się już w pamięci podręcznej, ponieważ wyszukiwanie odbywa się przy użyciu tylko ReadOnlySpan<char>
jako danych wejściowych, reprezentując widok w wejściowym adresie URL string
.
Typ StringPool
może być również przydatny podczas analizowania nieprzetworzonych żądań przy użyciu innego kodowania, na przykład UTF8. GetOrAdd
Istnieje przeciążenie, które pobiera dane wejściowe ReadOnlySpan<byte>
i Encoding
wystąpienie, które używa tymczasowego buforu wynajętego z puli w celu pobrania ReadOnlySpan<char>
wartości do użycia dla wyszukiwania. To ponownie może znacznie zmniejszyć liczbę alokacji w zależności od konkretnego scenariusza przypadku użycia.
Przykłady
.NET Community Toolkit