Updated : Eki 07, 2019 in Anasayfa

C# Döngüler, For, Foreach, While Döngüleri, Karşılaştırma

Selam Arkadaşlar,

Özellikle yazılım sektöründeki yeni arkadaşlar için kıssadan hisse şekilde bazı çıtır çerez bilgiler verecek makaleler yayınlayayım istiyorum arada bir de olsa. Bu döngüler konusu da bunlardan bir tanesi elbette.

Hepimizin bildiği gibi döngüler yazılımın en temel unsurlarından bir tanesi. Farklı alternatifler geliştirilmeye çalışılmış olsa da (linq bunlardan bir tanesi) çoğu zaman bir döngüden daha performanslı bir hal alamayabiliyorlar.

Örneğin en basit şekilde şöyle bir testi anlatayım;

Tüm ilişkilerden, database, vb… üçüncü parti uygulamalardan bağımsız şekilde bir list nesnesi içerisinde arama yaptığımda bile 1.000.000 kayıt içerisinde;

Linq: 368 milisaniye

Foreach: 183 milisaniye

sürede aynı sonucu dönmekte. Yani bu ve bunun gibi gerçek projelerdeki deneyimlerimiz de gösteriyor ki, döngüler her zaman için linq ‘dan epey yüksek performanslı çalışmakta. Ancak tabii ki, yazım kolaylığı, kodlamada harcanan zaman, projede ne kadar veriyi kullanacağınız, vb… kriterleri göz önünde bulundurarak ikisini de kullanabilmek mümkün.

Yani şimdi bana “linq’ya çamur atıyor” demeyin. 🙂 Zira ben de projelerimin muhtelif yerlerinde linq’nun nimetlerinden pek ala yararlanıyorum. Yalnızca yüklü veride işlem yapacağım zaman çok tercih etmemeye çalışıyorum.

Şimdi gelelim döngülerimizi ve örnek kullanımlarını anlatmaya.

Aslında biraz da kıyas yapalım ne dersiniz?

public class Icerik
{
public int Id { get; set; }
public string Ad { get; set; }
public string Soyad { get; set; }
public DateTime Tarih { get; set; }
}

Diye sabit bir sınıf tanımlayalım ve aşağıdaki şekilde bir list değişken tanımlayıp içerisini dolduralım;

List<Icerik> iceriks = new List<Icerik>();
for (int i = 0; i < 1000; i++)
{
iceriks.Add(new Icerik
{
Id = i,
Ad = CreatePassword(50).ToLower(),
Soyad = CreatePassword(50).ToLower(),
Tarih = DateTime.Now
});
}

Başka bir makalede detaylı anlatacağım “Stopwatch” ı kullanarak araya aldığım işlemin kaç milisaniyede sonuçlandığını ölçebileceğim.

Şimdi gelelim döngülere;

While Döngüsü

Stopwatch sw = new Stopwatch();
sw.Start();

int siradaki = 0;
while (siradaki < iceriks.Count)
{
Console.WriteLine(string.Format("{0} {1}{2}", iceriks[siradaki].Ad, iceriks[siradaki].Soyad, Environment.NewLine));

siradaki++;
}

sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

While Döngüsü Kullanımı

while() parantez içerisine hangi koşulda döngünün durmadan devam edeceğini yazıyoruz. Yukarıdaki örnekte olduğu gibi bir integer değişken oluşturup bunu her işlemde ++ diyerek bir arttırdım. Böylece “siradaki” sayısı “iceriks.Count” toplam sayısına eşit olana kadar döngü devam edecek.

Sonuç:

Burada gördüğünüz gibi listedeki 1.000 kaydın hepsini ekrana bir konsol aracılığı ile yazdırdım. Ve sonuç tam olarak: 1.068 milisaniye (1,06 saniye)

 

For Döngüsü

Stopwatch sw = new Stopwatch();
sw.Start();

for (int i = 0; i < iceriks.Count; i++)
{
Console.WriteLine(string.Format("{0} {1}{2}", iceriks[i].Ad, iceriks[i].Soyad, Environment.NewLine));
}

sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

For Döngüsü Kullanımı

Görüldüğü gibi aslında sihir “for (int i = 0; i < iceriks.Count; i++)” satırında gizli. Buradaki cümleyle aslında;

int i = 0: İlk değeri 0 olan “i” adında bir değişken oluştur,
i < iceriks.Count: “i” değişkeni iceriks.Count gibi bir rakamdan küçük olduğu sürece dön,
i++: Her bir dönüşte de “i” değişkenini 1 arttır

Demiş oluyoruz.

Yani i değişkenini tanımlıyoruz ve verdiğimiz son değerden (örnekde iceriks.Count olarak geçiyor. Siz istediğiniz rakamı verebilirsiniz.) küçük ise, yani koşul sağlanmaya devam ettiği sürece dön demiş oluyoruz.

Sonuç

Burada gördüğünüz gibi listedeki 1.000 kaydın hepsini ekrana bir konsol aracılığı ile yazdırdım. Ve sonuç tam olarak: 1.258 milisaniye (1,26 saniye)

 

Foreach Döngüsü

Stopwatch sw = new Stopwatch();
sw.Start();

foreach (var icerik in iceriks)
{
Console.WriteLine(string.Format("{0} {1}{2}", icerik.Ad, icerik.Soyad, Environment.NewLine));
}

sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

Foreach Döngüsü Kullanımı

Aslında temel olarak nesnenin içerisindekine örnek nesne yaratma gibi bir işlem yapıyor da diyebiliriz. Bellekte var la yok arası çok küçük bir nesne daha yaratıp yok ediyor. Ancak bu süreçte hem bizi “int i” gibi bir nesne oluşturmaktan kurtarıyor, hem de direk içerisinden daha çekmemize imkan sağlıyor. Yani aslında biz içeriği (listeyi) “iceriks” yazan kısımda veriyoruz ve döngü, o nesne içerisindeki ilk alt nesnenin sayısınca dönüyor ve her dönüşte de o an sırası gelen nesne kadar var tipinde “icerik” değişkenini üretiyor.

Bu şekilde örnekte de oluduğu gibi “icerik.Ad, icerik.Soyad” gibi direk alt özelliklere ulaşabiliyor ve hızlı bir şekilde de kodlama yapabiliyoruz.

Sonuç

Burada gördüğünüz gibi listedeki 1.000 kaydın hepsini ekrana bir konsol aracılığı ile yazdırdım. Ve sonuç tam olarak: 1.066 milisaniye (1,07 saniye)

 

While, For ve Foreach Karşılaştırması

İşte kıssadan hisse döngülerden aynı örnek üzerinde aynı zamanda karşılaştırma yaparak biraz olsun bahsetmiş olduk sanırım. Eğer daha detaylı sorularınız olur ise aşağıdaki yorum alanından sormayı lütfen ihmal etmeyin.

Sonuç tablosuna gelecek olur isek aynı data’da karşımıza naçizane aşağıdaki gibi bir tablo çıkmış bulunmakta;

Döngü Milisaniye Saniye
While 1.068 1,06
For 1.258 1,26
Foreach 1.066 1,07

 

Gördüğünüz gibi while ve foreach döngüleri genel anlamda başa baş şekilde sayılır iken for döngüsü çok ama çok az daha geriden takip ediyor performans olarak. Ama şunu da unutmayın ki, bu örnek sadece list dipinde basit bir ham datada yapıldı. Yani akademik bir çalışma olarak nitelendirmeden 🙂 siz de elinizdeki data’da denemelerinizi bu metot ile yapabilirsiniz. Benden tavsiye; Eğer önemli ve kapsamlı proje yapıyor iseniz, mutlaka ama mutlaka kritik noktalarda bu gibi testleri kendi örnek datanız ile yaparak performans olayına özen gösterin…

Bir başka makalede buluşmak üzere…

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir