Pula tablic
W dzisiejszych czasach rzadko używamy tablic. W większości przypadków używamy List<T>, która zapewnia większą funkcjonalność i jest oparta na ukrytej tablicy. Ale są sytuacje, w których wydajność jest kluczowa podczas pracy z wieloma obiektami.
Zaskoczyło mnie to, że zwykła tablica jest dwa razy wydajniejsza niż lista i nadal można ją zoptymalizować za pomocą ArrayPool.
W tym artykule pokażę, jak używać ArrayPool z przykładami kodu i wydajnością testów porównawczych.
Repozytorium kodów
Co to jest ArrayPool
ArrayPool to pula zasobów, która umożliwia ponowne wykorzystanie instancji typów tablicowych. Możesz go użyć do wypożyczenia i zwrotu buforów (tablic). Poprawi to wydajność, gdy często tworzysz i niszczysz tablice, które obciążają pamięć i GARBAGE COLLECTOR . Ta klasa jest bezpieczna dla wątków i można jej używać jednocześnie. Wracając do puli, możesz wybrać, czy chcesz wyczyścić zawartość tablicy, czy nie. Czyszczenie zajmie więcej czasu, ale Twoja sytuacja może wymagać za każdym razem uzyskania pustej tablicy.
Jak tego użyć
Istnieją dwa sposoby uzyskiwania dostępu do tablic z pamięci puli.
Pierwszym i najprostszym jest użycie właściwości ArrayPool Shared .
ArrayPool<T>.Shared
Otrzymasz domyślną implementację puli. Zawiera tablice o różnych rozmiarach. Może zwrócić większą tablicę niż żądałeś, ale z pewnością nie mniejszą. Wspólna pula to wygodny sposób na ponowne wykorzystanie tablic, ale są lepsze.
Bardziej wydajnym sposobem jest zainicjowanie puli przy użyciu metod tworzenia.
ArrayPool<T>.Create()
ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)
Metoda Create zwraca niestandardowe wystąpienie puli. Musisz go zapisać w pamięci podręcznej, aby uzyskać do niego dostęp z różnych lokalizacji i ponownie go użyć. Metoda sparametryzowana może pomóc w osiągnięciu najlepszej wydajności. Utworzy instancję, która grupuje tablice o długości nie większej niż maxArrayLength w segmenty o rozmiarze maxArraysPerBucket.
Wykorzystaj pulę tablic w języku C#, aby zredukować alokacje i poprawić wydajność aplikacji.
Reper
To jest prosty test. Porównamy różnice pomiędzy stworzeniem nowej tablicy a wypożyczeniem jej z puli. W każdym przypadku będziemy iterować po zbiorze 1_000_000 elementów. Uwzględnię również List<T> w teście porównawczym, aby pokazać zalety wydajnościowe tablic.
Repozytorium kodów
Wnioski
Najbardziej zaskoczyło mnie to, że zwykła tablica jest dwukrotnie wydajniejsza niż lista pod względem szybkości i wykorzystania pamięci. I nadal można go zoptymalizować za pomocą ArrayPool. Korzystanie z basenu jest oczywiście drogą do zrobienia.
Istnieje zauważalna różnica czasu między użyciem standardowej tablicy a tablicą z puli. Różnica czasu to czas potrzebny do przydzielenia pamięci podczas tworzenia nowej tablicy za każdym razem. Oczywiście istnieje również różnica w alokacji pamięci. ArrayPool nie musi przydzielać nowej pamięci. Ponownie wykorzystuje ten sam blok.
Jako ostrzeżenie dodałem „pulę niestandardową bez buforowania”, abyś mógł zobaczyć, co się stanie, gdy za każdym razem utworzysz nową pulę. Zasadniczo jest to to samo, co tworzenie nowej tablicy za każdym razem.
W tym prostym przykładzie trudno jest pokazać różnicę w wydajności między udostępnioną a niestandardową pulą ArrayPool. Byłoby to zauważalne, gdy używanych jest wiele tablic o różnych rozmiarach.
Korzystanie z ArrayPool może nie zawsze być najwygodniejsze, ale czasami pozwala w razie potrzeby zaoszczędzić dużo mocy obliczeniowej.

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































