Udostępnij za pośrednictwem


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

Więcej przykładów można znaleźć w testach jednostkowych.