![]()
Hangi döngü daha hızlıdır. Hangi durumlarda hangisini kullanmak daha uygundur? Normalde biz en basit anlamıyla elimizde bir liste varsa yada Dizi şeklinde yada başka bir tanımda çoklu bir data varsa For yada Foreach döngüsünü kullanarak Datalarımızı tek tek ele alabiliyoruz ama Binlerce datanın olduğu projelerde iş biraz daha değişiyor ve bu sefer performans devreye giriyor ve daha detaya girmek zorunda kalıyoruz. Öncelikle elimde 1000 e yakın datası olan bir tablo var. O tablodaki herhangi bir alanı her iki döngü ile çekerek hızlarını kıyaslayalım. Öncelikle For döngüsü ile dataları çektim.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Context db = new Context(); var orderList = db.orders.ToList(); Stopwatch stopwatch1 = new Stopwatch(); stopwatch1.Start(); for (int i = 0; i < orderList.Count; i++) { Console.WriteLine(“For => ShipName : {0} Freight: {1}”, orderList[i].ShipName, orderList[i].Freight); } stopwatch1.Stop(); TimeSpan ts1 = stopwatch1.Elapsed; Console.WriteLine(“Data Adedi: {0}”, orderList.Count); Console.WriteLine(“For Döngüsü Süresi: {0:00}:{1:00}:{2:00}:{3:00}”, ts1.Hours, ts1.Minutes, ts1.Seconds, ts1.Milliseconds / 10); |
Sonuç:

Şimdide Aynı dataları Foreach ile çektim
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Context db = new Context(); var orderList = db.orders.ToList(); Stopwatch stopwatch2 = new Stopwatch(); stopwatch2.Start(); foreach (var item in orderList) { Console.WriteLine(“Foreach => ShipName : {0} Freight: {1}”, item.ShipName, item.Freight); } stopwatch2.Stop(); TimeSpan ts2 = stopwatch2.Elapsed; Console.WriteLine(“Data Adedi: {0}”, orderList.Count); Console.WriteLine(“Foreach Döngüsü Süresi: {0:00}:{1:00}:{2:00}:{3:00}”, ts2.Hours, ts2.Minutes, ts2.Seconds, ts2.Milliseconds / 10); |
Sonuç:

Daha Bitmedi
Görüldüğü gibi ilk çalıştırmada For döngüsünün daha hızlı olduğu anlaşılıyor. Fakat bu hızları değiştiren başka nedenlerde var. Aslında sizden hangi sıklıkta data isteniyor ve o datalar kaç yerde çağrılıyor vb durumlarda önemlidir. Mesela elimdeki dataları tekrar çağırdığımda olayın değiştiğini gördüm Bu seferki hızlar ;
For Döngüsü hızı:

Foreach döngüsü hızı

Böyle olmasının sebebi , For döngüsü iki değişkenle iş yapar (count ve i). Bu iş için Stack te bir alan kullanılır. (Stack RAM de bulunan bir alandır yani bu iş için RAM de geçici bir alan oluşur ve kullanılır.) Foreach te ise dört olay vardır (item, AccountList nesnesi ve derleyici tarafından oluşturulan iki alan) için yine Stack te bir alan kullanılır.
Dolayısıyla kodlar çalışırken CLR’de (çalışma esnasında) ihtiyaç duyulan belleğin tamamı Stack te ayrılır. Bu işlem Stack te gerçekleştiği için hızlıdır ama biraz maliyeti olacaktır. Bu nedenle foreach döngüsünün fazladan iki alanı nedeniyle maliyetli olacaktır.
Yani Dataları birden fazla çağırmak zorunda kalırsak bu durumda For döngüsünün hızı düşmektedir.
Sonuç olarak
=> Datalar bir kez çağrılacaksa for döngüsü , foreach döngüsünden daha hızlıdır.
=> Tekrarlı ve birden fazla çağrılacaksa foreach döngüsü daha hızlıdır çünkü listedeki datayı saklayan değişkene erişim for da olduğu gibi , listedeki bir dataya göre daha hızlıdır ama biraz daha maliyetlidir.
=> Aslında bu hızlar Listeye göre de değişmektedir. Enumerable , Collection , List , Dictionary bunların detayını da belki başka makale anlatırım
Kod Kaynağı : https://github.com/Mesut66/Loops/tree/master
Sağlıcakla kalın…








Bir yanıt yazın