.Net Core 3+ Object Pooling

Erkan Güzelküçük
Devbase
Published in
2 min readAug 30, 2020

Uygulama içerisinde kullanacağımız tiplerin oluşturulması ve kullanımından sonra yok edilmesi büyük bir maliyettir. Bu nedenle uygulama içerisinde kullanılacak tiplerin bir havuzda tutularak istendiği zaman kullanılması ve kullanımı bittikten sonra tekrar o havuza bırakılması en mantıklı yol olacaktır. .Net Core’da bunu IHttpClientFactory interface’in mimarisinde görebilirsiniz.

ObjectPool<T> Get ve Set olmak üzere iki farklı metodu bulunmaktadır. Get bildiğiniz üzere talep etmek için kullanılan metod. Set ise data iletmek için kullanılan metod. Get metodu burada havuzda bulunan ilgili nesneyi almak için kullanılmaktadır. Return ise bu nesnenin tekrar kullanılabilmesi için havuza geri vermek için kullanılmaktadır.

.Net ekosistemine bakıldığı zaman bir çok alanda Object Pooling kullanılmaktadır. Paylaşmış olduğum kod yapısı basit bir implementasyon gerektirse de .Net Core tarafından geliştirilmiş bir Object Pooling yapısı bulunuyor. Microsoft.Extensions.ObjectPool namespace’i altında bulunan tipleri kullanarak Object Pooling ile performansınızı artırabilirsiniz.

Object Pooling kullanımının en önemli noktalarından birisi sıfırlama işlemidir. Örnek olarak StringBuilder bir Object Pooling kullanan nesnedir. Bu nesneyi havuzdan alıp kullandıktan sonra havuza tekrar bırakırken sıfırlama işlemi yapılması gerekir. Eğer yapılmaz ise, bir sonraki talep ile bu nesne kullanılmak istenirse içerisi dolu olarak kullanmaya başlayacaktır. Bu tehlikeli sonuçlar doğurabilir.

Bu şekilde bir Policy oluşturarak Return işlemi olduğu anda yani nesne havuza bırakılmak istendiğinde içeriği Clear edilerek temizlenebilir. Bu teorik bir örnektir. .Net Core StringBuilder nesnesi için Microsoft.Extensions.ObjectPool.StringBuilderPooledObjectPolicy isminde bir policy üretmiştir. Bu policy kullanılarak projenizi geliştirebilirsiniz.

Object Pooling mekanizmasını her yerde kullanmak mantıklı olmayacaktır. Oluşturulması ve yok edilmesi maliyetli ve performansı etkileyen alanlarda kullanmanız ve testlere dayalı kullanımlar gerçekleştirmelisiniz. Aksi halde projenin her yerinde Object Pooling kullanımı ekstra bir yük getirecektir. Okunulabilirliği de bir hayli zayıflatabilir.

--

--

Erkan Güzelküçük
Devbase

Software Architecture and Research Applications Development Team Leader at Koç University