HashSet kullanımı ve HashSet performans incelemesi

HashSet HashSet performans

0 8.535

HashSet & HashSet Performans Değerlendirmesi

Bu makalemizde HashSet kullanımı ve HashSet performans değerlerine göz atacağız. HashSet<T> .Net 3.5 framework ile System.Collections.Generic namespace içinde  kullanıma sunulan koleksiyonlardan biridir. HashSet<T> için özellikle List Generic tip’ in gölgesinde kalmış, yazdığımız kodlarda nadiren kullanılan framework’ün istenmeyen koleksiyon tipi demek çok da yanlış olmaz. Durum bu şekilde olunca HashSet yeteneklerinin başka bir koleksiyon tip  ile sağlandığı kod bloklarının hali HashSet’ in egosunu epeyce kabartacak dereceye gelebiliyor. HashSet in özelliklerinden bahsedecek olursak

  • Diğer koleksiyon tiplerinde olduğu gibi genişletilebilir kapasiteye sahiptir. Yeni öğe eklendiğinde veya silindiğinde otomatik olarak kapasitesinde değişik yapar.
  • HashSet sıralı bir koleksiyon tipi değildir. Bu nedenle eklediğimiz nesnelerin ilk ,son veya herhangi eklenme index’leri konusunda garanti vermez. HashSet indexlemesini HashCode olarak yapmaktadır.
  • HashSet tekrar eden nesne içermez. 1,3,1 değerlerini sırasıyla eklediğimizi varsayarsak işlem sonunda elimizde 1,3 değerleri olacaktır.Veri eklemek içn kulanılan Add metodu dönüş tipi olarak bool tipinde bir değer dönmektedir.
  • HashSet içinde bir değeri aramak çok hızlıdır. Koleksiyonun en önemli tercih noktası da bu olmalıdır. Arama yaparken hash-based searching algorthm kullanır.

Şimdi kısaca HashSet metodlarına göz atıp kullanımını örnekleyelim.

(Tanımlama)Initialize Instance

Add

Set içine nesne eklemek için kullanılır ve geriye bool tipinde değer döner Add HashSet ‘ in dezavantajlı durumunu ortaya çıkarır. HashSet’ e  ekleme işlemi yapmak diğer koleksiyon tiplerine göre daha yavaştır. Bunun neden eklenilen her nesneyi hash-based olarak saklamasıdır. Bu yavaşlığın meyvesini ise set içine lookup(arama) yaptığımızda alırız.

sonucu kontrol ettiğimizde true true false set count : 2 elde edeceğiz.

Remove

set içindeki öğeyi silme işlemi için kullanılır ve geriye bool tipinde değişken döner. Remove çalışma mantığında ilk olarak set içine lookup yapar nesneyi bulunur sonra siler. Bu işlem HashSet üzerinde oldukça hızlıdır. Set içinde olmayan bir nesne remove edildiğinde değer false olarak geri döner. Parametre olarak Initialize edilen set tipinde nesne alır. Biz set’imizi string oluşturduğumuz için remove metoduna parametre olarak string nesne göndereceğiz.

RemoveWhere

Set üzerinde verilen koşul’a uygun tüm kayıtları silmek için kullanılır. Metod parametre olarak koşul(condition) alır yani lambda expression veya predicate kullanabiliriz.

Contains

Set üzerindeki nesneye direk olarak erişim sağlar. O(1) ilişkisi vardır. Yani nesneye direk erişim. Bu ifadeyi koleksiyon dökümanlarında O(n) veya O(1) şeklinde görebilirsiniz. Geriye bool tipinde değer döndürür.

HashSet ile ilgili diğer metodları msdn üzerinden detaylı şekilde inceleyebilirsiniz.

HashSet kullanımı performans incelemesi

HashSet performansını incelerken karşılaştırma koleksiyon tipi olarak alternatifi olduğu List koleksiyon tipini kullanacağız.

Performans Sonucu

üst üste gerçekleştirdiğimiz Add işlemi List ‘ in üstünlüğüyle sonuçlandı. Buradan elde edeceğimiz sonuç set içinde lookup yapmayacaksak List koleksiyonunu tercihimiz olabilir. Şimdi senaryomuzu yenileyelim ve sonucu tekrar değerlendirelim.

 

 

yukarıdaki kod blogunda hashSet’in Add Remove Contains gibi methodlarla oluşturduğu iş parçacıklarında yükselen grafiğini görebilirsiniz. Veri büyüklüğü arttıkça HashSet in list’e göre daha iyi sonuçlar verdiği ortada.

O halde büyük verinin olduğu özellikle search işlemi yapacağımız kod bloklarında hashset ‘ i kullanmak bize performans yönünden fayda sağlayacaktır demek yanlış olmayacaktır.

H.Burak Karadağ

Referans

msdn
http://stackoverflow.com/

Email adresiniz yayınlanmayacaktır.