Partager via


StringPool

Le type StringPool implémente un pool configurable pour les instances string. Vous pouvez l’utiliser pour réduire les allocations lors de la création de plusieurs instances string à partir de mémoires tampons de char ou byte valeurs. Son mécanisme est un peu similaire à stringla centralisation, aux principales différences près que le pool est configurable, peut être réinitialisé, est implémenté avec une stratégie du meilleur effort et ne nécessite pas de pré-instancier des objets string, afin qu’il puisse enregistrer les allocations initiales aussi lorsque vous travaillez sur des mémoires tampons temporaires.

API de plateforme : StringPool

Syntaxe

Le point d’entrée principal de StringPool est son API GetOrAdd(ReadOnlySpan<char>), qui retourne une instance string correspondant au contenu de l’entrée ReadOnlySpan<char>, et obtenant peut-être l’objet retourné à partir du pool interne.

Par exemple, imaginez que nous ayons une entrée string représentant l’URL d’une requête web donnée et que nous voulions également récupérer un string à partir du nom d’hôte uniquement. Si nous obtenons un grand nombre de requêtes, éventuellement pour un petit nombre d’hôtes, nous pouvons mettre en cache ces instances string à l’aide du type StringPool comme suit :

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

La méthode ci-dessus ne fait aucune allocation du tout si le string demandé est déjà présent dans le cache, car la recherche est effectuée avec juste une entrée ReadOnlySpan<char>, représentant une vue sur l’URL d’entrée string.

Le type StringPool peut également être utile lors de l’analyse des requêtes brutes à l’aide d’un encodage différent, par exemple UTF8. Il existe une surcharge GetOrAdd qui prend une entrée ReadOnlySpan<byte> et une instance Encoding, cette dernière utilisant une mémoire tampon temporaire louée à partir du pool pour récupérer une valeur ReadOnlySpan<char> à utiliser pour la recherche. Cela peut à nouveau réduire considérablement le nombre d’allocations en fonction du scénario de cas d’usage spécifique.

Exemples

Vous trouverez d’autres exemples dans les tests unitaires.