Sdílet prostřednictvím


StringPool

Typ StringPool implementuje konfigurovatelný fond pro string instance. To se dá použít k minimalizaci přidělení při vytváření více string instancí z vyrovnávací paměti char nebo byte hodnot. Poskytuje mechanismus, který je trochu podobný string prokládání, s hlavními rozdíly v tom, že fond je konfigurovatelný, lze resetovat, je implementován se zásadami nejlepšího úsilí a nevyžaduje vytvoření string instance objektů, takže může uložit počáteční přidělení i při práci na dočasných vyrovnávacích pamětích.

Rozhraní API platformy: StringPool

Syntaxe

Hlavním vstupním bodem pro StringPool je jeho GetOrAdd(ReadOnlySpan<char>) rozhraní API, které vrací string instanci odpovídající obsahu vstupu ReadOnlySpan<char>, pravděpodobně získání vráceného objektu z interního fondu.

Představte si například, že máme vstup string představující adresu URL daného webového požadavku a chceme také načíst string pouze název hostitele. Pokud získáme velký počet požadavků na malý počet hostitelů, můžeme tyto instance uložit do mezipaměti string , můžeme to udělat následujícím StringPool způsobem:

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);
}

Výše uvedená metoda vůbec nepřiděluje žádné přidělení, pokud je požadovaná string již v mezipaměti, protože vyhledávání se provádí stejně ReadOnlySpan<char> jako vstup, který představuje zobrazení na vstupní adrese URL string.

Typ StringPool může být také užitečný při analýze nezpracovaných požadavků pomocí jiného kódování, například UTF8. GetOrAdd Existuje přetížení, které přebírá vstup ReadOnlySpan<byte> a Encoding instanci, která používá dočasnou vyrovnávací paměť pronajmutou z fondu k načtení ReadOnlySpan<char> hodnoty, která se má použít pro vyhledávání. To může výrazně snížit počet přidělení v závislosti na konkrétním scénáři použití.

Příklady

Další příklady najdete v testech jednotek.