BenchMark List Vs Dictionary Vs DictionaryTryGetValue
Selamlar,
Bu makalede birkaç Data Collection ile çalışıp, aralarındaki en performanslı olanı bulmaya çalışacağız.
Tuple List: Aşağıdaki örnekde List, key ve value olarak Tuple tipinde, “string” ve “int” şeklinde 2 değer almakta ve geri dönmektedir. En başta örnek amaçlı sıralı 40000 kayıt ilgili “List<string,int>”‘e atılmaktadır. Sonra 200 tane random üretilen int tipinde ID’li kayıt, ilgili liste içerisinde linq query sorgusu ile aranmakta ve cusomerIDListe’e doldurulmaktadır. İlk bakıldığında loop içerisinde linq query’nin maliyeti çok yüksektir. Bu maliyet, çoğalan kayıt sayısı ile orantılı olarak artmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[Benchmark] public List<int> BenchToListTuple() { List<(string key, int value)> list = new List<(string, int)>(); for (int i = 1; i < 20000; i++) { list.Add(($"{i}_Bora", 5345 + i)); list.Add(($"{i}_Mehmet", 6666 + i)); } Random random = new Random(); List<int> customerIDList = new List<int>(); for (int i2 = 0; i2 < 100; i2++) { int randomNumber = random.Next(0, 20000); var item = list.FirstOrDefault(item => item.key == $"{randomNumber}_Bora"); var item2 = list.FirstOrDefault(item => item.key == $"{randomNumber}_Mehmet"); customerIDList.Add(item.value); customerIDList.Add(item2.value); } return customerIDList; } |
Dictionary Key-Value: Bu örnekde, “List” yerine “Dictionary” nesnesi kullanılmıştır. Bir önceki örnekde olduğu gibi, 40000 kayıtlık bulk data atılmıştır. İçerisinden rastgele 200 data çekilmiştir. İlgili kaydın olup olmadığı, öncelikle “Any()” methodu ile bakılmış ve bulunmayan kayıtlar “0” olarak, bulunan kayıtların da değeri ile birlikte, bir Liste içine eklenerek geri dönülmüştür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[Benchmark] public List<int> BenchToDictioanry() { Dictionary<string, int> list = new Dictionary<string, int>(); for (int i = 1; i < 20000; i++) { list.Add($"{i}_Bora", 5345 + i); list.Add($"{i}_Mehmet", 6666 + i); } Random random = new Random(); List<int> customerIDList = new List<int>(); for (int i2 = 0; i2 < 100; i2++) { int randomNumber = random.Next(0, 20000); var item = list.Any(x => x.Key.Equals($"{randomNumber}_Bora")) ? list[$"{randomNumber}_Bora"] : 0; var item2 = list.Any(x => x.Key.Equals($"{randomNumber}_Mehmet")) ? list[$"{randomNumber}_Mehmet"] : 0; customerIDList.Add(item); customerIDList.Add(item2); } return customerIDList; } |
Dictionary TryGetValue: Son örnekde, “Dictionary” içinde ilgili aranacak kayıt var mı sorusunun cevabı olarak “Any()” şeklinde bir Linq sorgusu yerine, Dictionary’nin “TryGetValue()” methodu kullanılmıştır. Burada, önceki örnekden farklı olarak bir var mı koşulu yoktur. Önceki örnekte, ilgili kayıt var mı ve varsa tekrardan Dictionary içinde bulunarak, geri dönülmüştür. Bu örnekde, ilgili kayıt doğrudan aranmakta ve bulunamadığı takdirde “0” değeri dönülmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[Benchmark] public List<int> BenchToDictioanryTryGetvalue() { Dictionary<string, int> list = new Dictionary<string, int>(); for (int i = 1; i < 20000; i++) { list.Add($"{i}_Bora", 5345 + i); list.Add($"{i}_Mehmet", 6666 + i); } Random random = new Random(); List<int> customerIDList = new List<int>(); for (int i2 = 0; i2 < 100; i2++) { int randomNumber = random.Next(0, 20000); var item = list.TryGetValue($"{randomNumber}_Bora", out int value); var item2 = list.TryGetValue($"{randomNumber}_Mehmet", out int value2); customerIDList.Add(item ? value : 0); customerIDList.Add(item2 ? value2 : 0); } return customerIDList; } |
Benchmark Sonuç: Aşağıda görüldüğü gibi, “ListTuple ve Dictionary” arasında Memory Allocation ve işlem zamanı açısından pek de bir fark bulunmamaktadır. Ama Dictionary’nin “TryGetValue()” methodu muzzam çalışmakda, ve tartışmasız benim tek tercihim olmaktadır. Data Structures konusu aslında yazılıma başlarken en başta araştırılıp öğrenilmesi gereken bir konudur. Örneğin Linked List, Stack, Queue, HashTables gibi daha birçok data structure nesnesi bulunmakta ve ihtiyaçlara göre hepsinin birbirine göre avantaj ve dezavantajı olmaktadır.
Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hepinize hoşçakalın.
Source Code: https://gist.github.com/borakasmer/ad24ddef72b73465f41177abc6136fac
Son Yorumlar