Bu makalede C# ile for
ve foreach
döngüleri arasındaki farkları inceleyeceğiz.
Böylece #1 numaralı istek makaleyi yazmış olacağım :)
Not : Issues sayfasında varolan makale isteklerini görebileceğinizi, hatta yeni makale isteğinde bulunabileceğinizi biliyor muydunuz?
Öncelikle for ve foreach döngülerini C# programlama dilinde nasıl kullanıyoruz, nasıl yazıyoruz, hemen hatırlayalım;
for döngüsünün özelliği, bir başlangıç noktasından bir bitiş noktasına doğru, istediğimiz adım aralığında ilerleyebilmesidir.
Örneğin, Nisan ayının günlerini ekranda göstermek istersek aşağıdaki gibi 0..30 arasında sırasıyla ilerleyen bir döngü oluşturabiliriz;
Eğer olimpiyatların hangi tarihlerde gerçekleştirildiğini ekranda göstermemiz gerekiyorsa, aşağıdaki örnekte olduğu gibi, dizi değişkeninin başlangıç değerini ilk olimpiyatın yapıldığı 1896 yılına ayarlar, döngünün bulunduğumuz yıla kadar (bulunduğumuz yıl dahil) sürmesini sağlar, her 4. yılı elde edebiliriz;
Hatta, istersek for
döngüsünün tersten çalışmasını bile sağlayabiliriz;
foreach döngüsünün özelliği, bir listenin üzerinde adım adım ilerleyerek tüm öğelerini bize sadece-okunur olarak sağlamasıdır.
foreach döngüsünde unutulmaması gereken önemli nokta, döngü değişkeninin sadece-okunur (read-only) olmasıdır. Aşağıdaki örnekte olduğu gibi değişkenin değeri üzerinde değişiklik yapamayız;
for döngüleri genellikle bir dizinin öğeleri üzerinde gezinmek için kullanılır. Örneğin;
Bu kod örneğinde, şöyle bir problem var; döngünün ilk adımı gerçekleştikten sonra önce iLoop
isimli döngü değişkeninin değeri 1 arttırılacak. Sonra iLoop
değişkeninin değeri döngünün sonuna erişilip-erişilmediği belirlensin diye dizideki eleman adedi ile karşılaştırılacak.
Bir sonraki döngü adımının sonunda gene iLoop
değişkenin değeri 1 arttırılacak ve döngünün sonuna gelinip-gelinmediğinin belirlenmesi için dizideki eleman adedi ile karşılaştırılacak.
Hatta dizideki eleman adedi ile karşılaştırma her döngü adımında tekrar tekrar yapılacak.
Çok önemli gibi gözükmese de, dizideki eleman adedini döngü öncesi bir değişkene alıp, döngü içerisinde hep bu değişken ile kontrol etmek, performansa olumlu katkı sağlayacaktır.
Not: döngünün başından sonuna kadar dizideki eleman adedinin değişmediğini varsayıyorum
Hatta, madem for
döngüsünün ilk parçasında döngü değişkenini tanımlıyoruz, aynı anda ikinci bir değişken daha tanımlayamaz mıyız?
Tanımlayabiliriz :)
Aşağıdaki kod örneğinden de görebileceğiniz gibi, aynı anda iki değişken tanımlayıp, biri ile döngüyü ilerletmek, diğeri ile dizideki eleman adedini bir defa hesaplatmak mümkün;
Performans karşılaştırması için aşağıdaki küçük uygulamayı geliştirdim;
Sonuçlar, bilgisayarın konfigürasyonuna, o an çalışmakta olan uygulamalara, debug-release mode’lara, x86-x64 mimariler arasındaki farklara, .Net versiyonuna, vs göre o kadar fazla farklılık gösterebilir ki, performans konusuna çok vakit ayırmak istemedim.
Eğer yorumunuz veya sorunuz varsa, lütfen aşağıya yazınız. Sizin sistemlerinizde üretilecek sonuçları da merak ediyorum.
Benim kullanmakta olduğum notebook’ta sonuçlar aşağıdaki gibi;
CPU: i7 7700HQ x64
OS: Windows 10 (16241) 64bit
RAM: 32GB 2666MHz
Benim ortamımda foreach
döngüsü, for
döngüsünden daha performanslı çıktı. 80.000 elemanlı bir dizide aradaki fark birkaç nanosaniye civarında olsa da, 800.000.000 elemanlı bir dizide fark yaklaşık 700ms civarına çıkıyor.
Çok elemanlı olmasa da sürekli üzerinde döndüğümüz diziler varsa, her seferinde kazanacağımız nanosaniyeler-milisaniyeler, toplamda büyük rakamlara ulaşabilir ;)
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484