For - ForEach - List.ForEach performans karşılaştırması

Bir dizinin tüm elemanları üzerinde bir aksiyon gerçekleştirmemiz gerektiğinde, sıklıkla şu üç yoldan birini kullanırız;

  • For döngüsü
  • ForEach Döngüsü
  • List generic sınıfının ForEach extension method’u

Şimdi basit bir örnek ile bu üç yöntemi karşılaştıralım ()*;

( Not : Karşılaştırmalar; Windows7 64bit kurulu, Core2Duo 3.0 GHz ve 4 GB Ram’li bilgisayarımda yapılmıştır. Sadece fikir verme amaçlıdır, farklı durumlarda faklı sonuçlar ile karşılaşılabilir.)*

Öncelikle parametre olarak Generic List (List<T>) alan üç tane method yazalım;

private static long ToplamFor(List<int> Liste) { long Sonuc = 0; int ListeAdet = Liste.Count;

for (int iLoop = 0; iLoop &lt; ListeAdet; iLoop++)
    Sonuc += Liste[iLoop];

return Sonuc; }

private static long ToplamForEach(List<int> Liste) { long Sonuc = 0;

foreach (int Rakam in Liste)
    Sonuc += Rakam;

return Sonuc; }

private static long ToplamForEachExtension(List<int> Liste) { long Sonuc = 0;

Liste.ForEach(Rakam =&gt; Sonuc += Rakam);

return Sonuc; }</pre>

Aynı testi 10 defa gerçekleştirip, ortalamasını alacak bir test fonksiyonu yazalım. Yazacağımız fonksiyonu test listesinde olacak eleman adedini parametre olarak alacak;

private static void Testler(int ListeElemanAdet)
{
    List<int> ForSureler = new List<int>();
    List<int> ForEachSureler = new List<int>();
    List<int> ForEachExtensionSureler = new List<int>();

    List<int> TestVerisi = Enumerable.Range(0, ListeElemanAdet).ToList();

    Stopwatch sw = new Stopwatch();

    for (int iLoop = 0; iLoop < 10; iLoop++)
    {
        sw.Restart();
        ToplamFor(TestVerisi);
        sw.Stop();
        ForSureler.Add(sw.ElapsedTicks);

        sw.Restart();
        ToplamForEach(TestVerisi);
        sw.Stop();
        ForEachSureler.Add(sw.ElapsedTicks);

        sw.Restart();
        ToplamForEachExtension(TestVerisi);
        sw.Stop();
        ForEachExtensionSureler.Add(sw.ElapsedTicks);
    }

    Console.WriteLine("For Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForSureler.Average());

    Console.WriteLine("ForEach Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForEachSureler.Average());

    Console.WriteLine("ForEach Extension ({0} Eleman) : {1}", ListeElemanAdet, ForEachExtensionSureler.Average());
}

Artık uygulamamızın test fonksiyonunu kullanacak son kod parçasını yazabiliriz;

public static void Main(string[] args)
{
    Console.WriteLine("Test Başladı");

    Testler(1000);
    Testler(5000);
    Testler(10000);
    Testler(50000);
    Testler(100000);
    Testler(500000);
    Testler(1000000);
    Testler(5000000);
    Testler(10000000);
    Testler(50000000);

    Console.WriteLine("Test Bitti");

    Console.ReadLine();
}


Bakalım yaptığımız testler nasıl sonuç vermiş;

![For - ForEach - ForEach extension Performans Karşılaştırması / Ekran Görüntüsü](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_0.png "For_ForEach_ForEachExtensionPerformansTest")

Sonuçlardan aşağıdaki tabloyu çıkarttım;
**Test Verisi** **For** **ForEach** **ForEach Extension**
*1.000* 71,1 121,5 79,7
*5.000* 34,3 92,2 55,6
*10.000* 70,0 185,1 110,4
*50.000* 349,3 918,4 568,3
*100.000* 715,2 1.902,7 1.159,0
*500.000* 3.583,3 9.379,3 5.600,0
*1.000.000* 7.260,4 18.877,9 11.242,8
*5.000.000* 37.927,2 96.096,9 57.845,4
*10.000.000* 74.553,5 192.621,6 115.559,6
*50.000.000* 371.698,1 956.394,4 572.776,7
İlk olarak **50.000 elemana** kadar olan listeler için **karşılaştırma** yapalım; ![For - ForEach - ForEach extension Performans Karşılaştırması / 50.000 elemana kadar inceleme](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_1.png "For_ForEach_ForEachExtensionPerformansTest") Son olarak **50.000.000 elemana** kadar olan listeler için **karşılaştırma** yapalım; ![For - ForEach - ForEach extension Performans Karşılaştırması / 50.000.000 elemana kadar inceleme](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_2.png "For_ForEach_ForEachExtensionPerformansTest")

İlgili diğer makaleler

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı