Yazdığımız uygulamaların olmazsa-olmaz’larından birisi de, döngülerdir, özellikle for döngülerini sıklıkla kullanırız.Bu makaleyi okumaya devam etmeden önce, TPL (Task Parallel Library) – Task Class konusunda bilgi sahibi olmak için, MSDN’deki şu sayfaya bakabilirsiniz: Parallel Programing in .Net Framework (Türkçe kaynak için : TPL (Task Parallel Library) – Task Class ve Normal For ve Paralel For Döngülerinin Karşılaştırması)Task Parallel Library ile gelen Parallel sınıfının For methodunu kullanarak, Multi-Core destekli for döngüleri oluşturabiliriz.
Parallel Library‘den önce for döngüsü;
//10 adımlı döngü (0 dahil, 10 hariç)for (int iLoop = 0; iLoop < 100; iLoop++){// Yapılacak İş}
Parallel Library ile for döngüsü;
//10 adımlı döngü (0 dahil, 10 hariç)Parallel.For(0, 10, iLoop => {// Yapılacak İş});
Uzun tek bir döngü yazmak yerine, içiçe iki döngü yazdım, böylece, CPU ve İşletim Sistemi’nin çok adımlı döngülerde yaptığı iyileştirmeleri bir miktar azaltmayı ve daha doğru bir sonuç elde etmeyi amaçladım.Döngülerden bir tanesini yine de uzun tuttum (100.000.000 – Yüz Milyon Adım), böylece, eğer Framework’ün kendisi döngülerde iyileştirme yapıyorsa, bunları yakalamayı hedefledim.Diğer döngüyü ise nispeten daha kısa (500 – Beş Yüz) tuttum.private void btnNormalDongu_Click(object sender, EventArgs e){int Sayac = 0;Stopwatch sw = Stopwatch.StartNew();for (int iLoop = 0; iLoop < (int)txtTekrarAdedi.Value; iLoop++){for (int yLoop = 0; yLoop < (int)txtDonguAdedi.Value; yLoop++){Sayac++;}}sw.Stop();lblNormalDonguSonuc.Text = string.Format("{0:0,0} ms.", sw.ElapsedMilliseconds);}
private void btnParalelDongu_Click(object sender, EventArgs e){int Sayac = 0;Stopwatch sw = Stopwatch.StartNew();Parallel.For(0, (int)txtTekrarAdedi.Value, i => {Parallel.For(0, (int)txtDonguAdedi.Value, y => {Sayac++;});});sw.Stop();lblParalelDonguSonuc.Text = string.Format(“{0:0,0} ms.”, sw.ElapsedMilliseconds);}
Uygulamayı kendi bilgisayarımda çalıştırdığımda aldığım sonuçlar;Normal for döngüsü: 888.700 ms. (yaklaşık 14 dakika 48 saniye)
Paralel for döngüsü: 219.326 ms. (yaklaşık 3 dakika 39 saniye)
Aradaki fark: 75%