Groupe de baies
De nos jours, nous utilisons rarement des tableaux. Dans la plupart des cas, nous utilisons List<T>, qui fournit plus de fonctionnalités et est basé sur un tableau sous le capot. Mais il existe des situations où la performance est la clé lorsqu'il s'agit de traiter de nombreux objets.
Ce qui m'a surpris, c'est qu'un tableau simple est deux fois plus efficace qu'une liste, et qu'il peut toujours être optimisé avec ArrayPool.
Dans cet article, je vais vous montrer comment utiliser ArrayPool avec des exemples de code et des performances d'analyse comparative.
Référentiel de code
Qu'est-ce qu'ArrayPool
ArrayPool est un pool de ressources qui permet de réutiliser des instances de types de tableaux. Vous pouvez l'utiliser pour louer et retourner des tampons (tableaux). Cela améliorera les performances lorsque vous créez et détruisez fréquemment des tableaux, qui sont lourds en mémoire et GARBAGE COLLECTOR . Cette classe est thread-safe et vous pouvez l'utiliser simultanément. En revenant au pool, vous pouvez choisir d'effacer ou non le contenu du tableau. L'effacement prendra plus de temps, mais votre situation peut nécessiter d'obtenir un tableau vide à chaque fois.
Comment l'utiliser
Il existe deux manières d'accéder aux baies à partir de la mémoire du pool.
La première et la plus simple consiste à utiliser la propriété ArrayPool Shared .
ArrayPool<T>.Partagé
Vous obtiendrez l'implémentation par défaut du pool. Il contient des tableaux de différentes tailles. Il peut renvoyer un tableau plus grand que celui que vous avez demandé, mais certainement pas plus petit. Un pool partagé est un moyen pratique de réutiliser les baies, mais il en existe de meilleures.
Le moyen le plus efficace consiste à initialiser votre pool à l'aide de méthodes de création.
ArrayPool<T>.Create()
ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)
La méthode Create renvoie une instance personnalisée du pool. Vous devez le mettre en cache pour y accéder depuis différents emplacements afin de le réutiliser. La méthode paramétrée peut aider à obtenir les meilleures performances. Il créera une instance qui regroupe les tableaux d'une longueur maximale de maxArrayLength dans des compartiments de taille maxArraysPerBucket.
Tirez parti de la mise en pool des baies en C# pour réduire les allocations et améliorer les performances de vos applications.
Référence
Il s'agit d'un test simple. Nous comparerons les différences entre la création d'un nouveau tableau et sa location à partir du pool. Dans chaque cas, nous allons itérer sur une collection de 1_000_000 éléments. J'inclurai également List<T> dans le benchmark pour montrer les avantages de performance des tableaux.
Référentiel de code
conclusion
Ce qui m'a le plus surpris, c'est qu'un tableau simple est deux fois plus efficace qu'une liste en termes de vitesse et d'utilisation de la mémoire. Et il peut toujours être optimisé avec ArrayPool. L'utilisation d'une piscine est évidemment la voie à suivre.
Il existe une différence de temps notable entre l'utilisation d'une baie standard et celle du pool. La différence de temps est le temps nécessaire pour allouer de la mémoire lors de la création d'un nouveau tableau à chaque fois. Bien sûr, il y a aussi une différence dans l'allocation de mémoire. ArrayPool n'a pas besoin d'allouer de nouvelle mémoire. Il réutilise le même bloc.
En guise d'avertissement, j'ai ajouté "Pool personnalisé sans mise en cache" afin que vous puissiez voir ce qui se passe lorsque vous créez un nouveau pool à chaque fois. C'est fondamentalement la même chose que de créer un nouveau tableau à chaque fois.
Dans cet exemple simple, il est difficile de montrer la différence de performances entre ArrayPool partagé et personnalisé. Cela serait perceptible lorsque de nombreux tableaux de tailles différentes sont utilisés.
L'utilisation d'ArrayPool n'est peut-être pas toujours la plus pratique, mais elle peut parfois vous faire économiser beaucoup de puissance de calcul en cas de besoin.
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































