Bir dizinin tüm elemanları üzerinde bir aksiyon gerçekleştirmemiz gerektiğinde, sıklıkla şu üç yoldan birini kullanırız;
Ş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 < 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 => 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 |
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484