Array-Pool
Heutzutage verwenden wir selten Arrays. In den meisten Fällen verwenden wir List<T>, das mehr Funktionalität bietet und auf einem Array im Hintergrund basiert. Aber es gibt Situationen, in denen Leistung der Schlüssel zum Umgang mit vielen Objekten ist.
Was mich überrascht hat, ist, dass ein einfaches Array doppelt so effizient ist wie eine Liste und trotzdem mit ArrayPool optimiert werden kann.
In diesem Artikel zeige ich Ihnen, wie Sie ArrayPool mit Codebeispielen und Leistungsvergleichen verwenden.
Code-Repository
Was ist ArrayPool
ArrayPool ist ein Ressourcenpool, der die Wiederverwendung von Instanzen von Array-Typen ermöglicht. Sie können es zum Mieten und Zurückgeben von Puffern (Arrays) verwenden. Es verbessert die Leistung, wenn Sie häufig Arrays erstellen und löschen, die viel Speicher und GARBAGE COLLECTOR benötigen . Diese Klasse ist Thread-sicher und kann gleichzeitig verwendet werden. Bei der Rückkehr zum Pool können Sie wählen, ob Sie den Inhalt löschen möchten oder nicht. Das Löschen dauert länger, aber in Ihrer Situation kann es erforderlich sein, jedes Mal ein leeres Array zu erhalten.
Wie man es benutzt
Es gibt zwei Möglichkeiten, auf Arrays aus dem Poolspeicher zuzugreifen.
Die erste und einfachste ist die Verwendung der Eigenschaft ArrayPool Shared .
ArrayPool<T>.Shared
Sie erhalten die Standardimplementierung des Pools. Es enthält Arrays unterschiedlicher Größe. Es kann ein größeres Array zurückgeben, als Sie angefordert haben, aber sicherlich nicht kleiner. Ein gemeinsam genutzter Pool ist eine bequeme Möglichkeit, Arrays wiederzuverwenden, aber es gibt bessere.
Der effizientere Weg besteht darin, Ihren Pool mit create-Methoden zu initialisieren.
ArrayPool<T>.Create()
ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)
Create-Methode gibt eine benutzerdefinierte Instanz des Pools zurück. Sie müssen es zwischenspeichern, um von verschiedenen Orten darauf zuzugreifen und es wiederzuverwenden. Die parametrisierte Methode kann dabei helfen, die beste Leistung zu erzielen. Es wird eine Instanz erstellt, die Arrays mit einer Länge von nicht mehr als maxArrayLength in Buckets der Größe maxArraysPerBucket gruppiert.
Nutzen Sie das Array-Pooling in C#, um Zuordnungen zu reduzieren und die Leistung Ihrer Anwendungen zu verbessern.
Benchmark
Dies ist ein einfacher Test. Wir werden die Unterschiede zwischen dem Erstellen eines neuen Arrays und dem Mieten aus dem Pool vergleichen. In jedem Fall werden wir über eine Sammlung von 1_000_000 Elementen iterieren. Ich werde auch List<T> in den Benchmark aufnehmen, um die Leistungsvorteile von Arrays zu zeigen.
Code-Repository
Schlussfolgerungen
Was mich am meisten überrascht hat, ist, dass ein einfaches Array in Bezug auf Geschwindigkeit und Speicherverbrauch doppelt so effizient ist wie eine Liste. Und es kann immer noch mit ArrayPool optimiert werden. Die Nutzung eines Pools ist offensichtlich der richtige Weg.
Es gibt einen spürbaren Zeitunterschied zwischen der Verwendung eines Standard-Arrays und einem aus dem Pool. Der Zeitunterschied ist die Zeit, die erforderlich ist, um Speicher zuzuweisen, wenn jedes Mal ein neues Array erstellt wird. Natürlich gibt es auch einen Unterschied in der Speicherzuweisung. ArrayPool muss keinen neuen Speicher zuweisen. Es verwendet denselben Block wieder.
Als Warnung habe ich „Benutzerdefinierter Pool ohne Caching“ hinzugefügt, damit Sie sehen können, was passiert, wenn Sie jedes Mal einen neuen Pool erstellen. Es ist im Grunde dasselbe, als würde man jedes Mal ein neues Array erstellen.
In diesem einfachen Beispiel ist es schwierig, den Leistungsunterschied zwischen gemeinsam genutztem und benutzerdefiniertem ArrayPool zu zeigen. Es würde sich bemerkbar machen, wenn viele Arrays unterschiedlicher Größe verwendet werden.
Die Verwendung von ArrayPool ist möglicherweise nicht immer die bequemste, aber manchmal kann es Ihnen bei Bedarf viel Rechenleistung sparen.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































