Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

List mi Dictionary mi ?


Öne çıkan mesajlar

Mesaj tarihi:
Selamlar şimdi bir IP havuzu yapmam gerekiyor ve belli aralıklarla bu havuzda ki aynı iplerin sayısını çıkarmam gerekiyor.

Diğer bir sorum. Ip adreslerni IpAdress olarak mı yoksa string olarak mı tutsam bilemedim çünkü c# 'da orta seviyelerdeyim.

Dictionary'de IpAdress, int yaparak eğer Ip hiç yoksa ekleticem daha sonra +1 ile update etmeyi düşünüyorum.

Hangisi daha mantıklı ve sağlıklı olur ?
  • 2 hafta sonra ...
Mesaj tarihi:
IPAddress veya string tutmanın performans açısından hiçbi fark yaratacağını sanmıyorum ben, o yüzden lazım olur diye IPAddress olarak tutmak daha faydalı olur. Bakarsın bi yerde IPAddress instance'ına laızm olur, sen ya da çağırdığın fonksiyon IPAddress.Parse(...) diyip parse etmek zorunda kalmaz.

List vs dictionary konusunda da List veya Dictionary olarak tutacağını varsayarsak durum şöyle;

List'te tüm IP adreslerinin toplam sayısını bulmak O(1) zamanlı bi işken (list.Count demek yeterli), herhangi bi IP adresinin sayısını bulmak zor (list.Where(x => x == ip).Count() demek gerek ki bu kesinlikle O(1) değil). Dictionary'de ise tam tersi, herhangi bi IP adresinin syısını bulmak O(1) zamanlı ve kolay (dict.GetOrDefault(ip, 0)), tüm IP'lerin toplamını bulmak zor (dict.Values.Sum() ki bu da O(1) değil). Yeni bi IP adresi eklemek ikisinde de kolay, ilkinde list.Add(ip), ikincisinde list[ip] = list.GetOrDefault(ip, 0) + 1;

Yalnız her iki durumda da direkt List ve Dictionary kullanmak yerine thread-safe alternatiflerini (List yerine BlockingCollection, Dictionary yerine ConcurrentDictionary) kullanmak lazım ki aynı anda aynı IP adresinden iki istek gelip farklı thread'ler tarafından ele alındığında sorun çıkarmasın. Tabi kullanım şekilleri birazcık daha değişiyo ama en azından güvenli.

Onun dışında, eğer sunucunu birden fazla instance olarak çalıştıracaksan ve bu IP adresleri her instance tarafından ortak olarak erişilecekse bi veritabanında veya Hazelcast, Redis gibi bi in-memory key-value store'da tutmak lazım.
×
×
  • Yeni Oluştur...