Queue ve List Performans Analizi

Erkan Güzelküçük
Devbase
Published in
2 min readJun 9, 2021

Bir çalışma listesi düşünün ve bu listede bulunan elemanları sırasıyla çekip belirli işlemler sonunda listeden kaldırmak istiyoruz. Şuan ben bu senaryoyu anlatırken bile muhtemelen kafanızda birşeyler canlanıyor. Kulağa “List” gibi geliyor :) Haklısınız, temelde bir kuyruk ama List kullanarak yazılıyor çoğunlukla.

Bu fotoğraf Indira Tjokorda tarafından çekilmiştir.

Ben de dahil neredeyse tüm C# geliştiricileri List’i bir çok noktada gereksiz yere kullanıyoruz. Bu durum tabii ki performansı olumsuz yönde etkiliyor. Örnek bir kod parçasını inceleyelim.

Kod bloğuna baktımızda, bunun temelde bir liste türü üzerine inşa edilmiş geçici bir sıra olduğunu fark ediyoruz. Bazı performans sorunlarını net bir şekilde görebilirsiniz. Bu kod ne kadar performans sağlar ne gibi sorunlar sergiliyor kısaca bakalım.

  1. workList nesnesini kontrol etmek için “Any()” kullanılıyor. Bu oldukça hızlı çalışır, ancak bunu bir nesneyi hemen açmak yerine ek bir kontrol olarak kullanıyor olmak performansı etkileyen bir faktör olacaktır.
  2. while içerisinde workingList nesnesinin First(); öğesi alınıyor bir değişken’e set ediliyor ve daha sonra nesneden bu öğe remove ediliyor. İlk olarak yeni bir değişken oluşturarak Memory gereksiz yere meşgul ediliyor. İkinci olarak First(); ile listenin ilk öğesi alınıyor ve listenin kalan öğeleri 1 sıra yukarı kayıyor. Bu durum büyük bir işlem esnasında olduğunu düşünürsek eyvah eyvah :)
  3. Remove işlemi yaparken bir referans ile karşılaştırma işlemi gerçekleşiyor. Döngü içerisinde item nesnesi Remove metoduna gönderiliyor ve belirli bir Equals işleminden geçiyor. Çok büyük bir sorun gibi görünmese bile bu bir sorun! Bunun yerine workingList.RemoveAt(0) kullanarak daha net olabilirsiniz. Ama asıl meselemiz bu değil :)

Asıl meselemiz Queue olması gereken bir iş için List kullanıyor olmamız. Bu noktada Queue ne kadar hızlı olabilir? Listemde sadece 100 öğe var gözle görülür performans sergiler mi? gibi sorulara cevap bulalım.

Bu gibi sorulara cevap ararken genellikle kullandığım BenchmarkDotNet package’dan bahsedeyim. Bu benim Code Benchmarking için kullandığım bir package. Bununla ilgili bir çok detay bulabilirsiniz. Kurulum aşamalarını geçiyorum.

Aslında çok complex değil. Sadece x miktarda öğe ekliyoruz ve while ile bunu remove ediyoruz. Benchmark 100, 1000 ve 10000 öğe ile 3 farklı test sonucunu verecek. Ayrıca boyutların performansı nasıl etkilediğini görmüş olacağız.

100 öğeli bir liste için bile Queue kullanmanın 5 kat daha hız kazandırdığını görebilirsiniz.

Sonuç

Queue kullanmak sadece performans açısından fayda sağlıyor olarak görülse de, aslında doğru kullanım türüdür. Bu yönden bakacak olursak eğer kod bloğunuzu bir başka developer okuduğunda ne yaptığını net olarak bilecek.

--

--

Erkan Güzelküçük
Devbase

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