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 à string
la 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.
.NET Community Toolkit