Dizi Havuzu

Dec 15 2022
Günümüzde dizileri nadiren kullanıyoruz. Çoğu durumda, daha fazla işlevsellik sağlayan ve gizli bir diziye dayanan List<T> kullanırız.

Günümüzde dizileri nadiren kullanıyoruz. Çoğu durumda, daha fazla işlevsellik sağlayan ve gizli bir diziye dayanan List<T> kullanırız. Ancak birçok nesneyle uğraşırken performansın anahtar olduğu durumlar vardır.

Beni şaşırtan şey, düz bir dizinin bir Listeden iki kat daha verimli olması ve yine de ArrayPool ile optimize edilebilmesi.

Bu yazımda size ArrayPool'u nasıl kullanacağınızı kod örnekleri ve kıyaslama performansı ile göstereceğim.

Kod Deposu

ArrayPool nedir?

ArrayPool, dizi türlerinin örneklerinin yeniden kullanılmasına izin veren bir kaynak havuzudur. Tamponları (dizileri) Kiralamak ve İade etmek için kullanabilirsiniz. Sık sık bellek ve ÇÖP TOPLAYICI üzerinde ağır olan dizileri oluşturup yok ettiğinizde performansı artıracaktır . Bu sınıf iş parçacığı açısından güvenlidir ve onu aynı anda kullanabilirsiniz. Havuza dönerken içeriği temizlemeyi veya dizilememeyi seçebilirsiniz. Temizleme daha fazla zaman alacaktır, ancak durumunuz her seferinde boş bir dizi almayı gerektirebilir.

Bu nasıl kullanılır

Havuz belleğinden dizilere erişmenin iki yolu vardır.

İlk ve en basiti, ArrayPool Shared özelliğini kullanmaktır.

ArrayPool<T>.Shared

Havuzun varsayılan uygulamasını alacaksınız. Farklı boyutlarda diziler içerir. İstediğinizden daha büyük bir dizi döndürebilir, ancak kesinlikle daha küçük olamaz. Paylaşılan bir havuz, dizileri yeniden kullanmanın uygun bir yoludur, ancak daha iyileri de vardır.

Daha verimli yol, oluşturma yöntemlerini kullanarak havuzunuzu başlatmaktır.

ArrayPool<T>.Create()

ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)

Create yöntemi, havuzun özel bir örneğini döndürür. Yeniden kullanmak üzere farklı konumlardan erişmek için önbelleğe almalısınız. Parametreleştirilmiş yöntem, en iyi performansın elde edilmesine yardımcı olabilir. En fazla maxArrayLength uzunluğundaki dizileri maxArraysPerBucket boyutunda kovalar halinde gruplandıran bir örnek oluşturacaktır .

Ayırmaları azaltmak ve uygulamalarınızın performansını iyileştirmek için C#'ta dizi havuzundan yararlanın.

Kalite testi

Bu basit bir testtir. Yeni bir dizi oluşturmak ile onu havuzdan kiralamak arasındaki farkları karşılaştıracağız. Her durumda, 1_000_000 öğeden oluşan bir koleksiyonu yineleyeceğiz. Dizilerin performans avantajlarını göstermek için karşılaştırmalı değerlendirmeye List<T>'yi de dahil edeceğim.

Kod Deposu

kalite testi

Sonuçlar

Beni en çok şaşırtan şey, düz bir dizinin, hız ve bellek kullanımı açısından bir Listeden iki kat daha verimli olmasıdır. Ve yine de ArrayPool ile optimize edilebilir. Bir havuz kullanmak açıkçası gitmenin yoludur.

Standart bir dizi kullanmakla havuzdan bir dizi kullanmak arasında gözle görülür bir zaman farkı vardır. Zaman farkı, her seferinde yeni bir dizi oluştururken belleği ayırmak için gereken süredir. Elbette hafıza tahsisinde de bir fark var. ArrayPool'un yeni bellek ayırmasına gerek yoktur. Aynı bloğu yeniden kullanır.

Bir uyarı olarak, her seferinde yeni bir havuz oluşturduğunuzda ne olduğunu görebilmeniz için 'Önbelleğe Alınmayan Özel Havuz' ekledim. Temel olarak her seferinde yeni bir dizi oluşturmakla aynı şeydir.

Bu basit örnekte, paylaşılan ve özel ArrayPool arasındaki performans farkını göstermek zordur. Farklı boyutlarda birçok dizi kullanıldığında fark edilir.

ArrayPool'u kullanmak her zaman en uygun olmayabilir, ancak bazen gerektiğinde size çok fazla bilgi işlem gücü kazandırabilir.