Parallel For Kullanımı C#
Merhaba Arkadaşlar,
Bir yazılımcı için
kodlamış olduğu bir programda en önemli unsurlardan birisi programın hızlı
olmasıdır sanırım. En azından benim için öyle Bu yüzden bu sıralar çokça
ihtiyaç duyduğum hızlı döngüler için standart for döngüsünden çok daha hızlı
çalışan, yazılım hayatımıza .Net Framework 4.0 ile girmiş olan Parallel.for
döngüsünden bahsetmeye karar verdim.
Kavraması ve
uygulaması çok basit olan bu yapı yeri geldiğinde hayat kurtarabilmekte.
Konuyla ilgili örneğimizde çok temel bir örnek üzerinden gidip bir konsol
uygulası üzerinde for ve parallel.for arasındaki farkı göstermeye çalışacağım.
Calculator() isimli
metodta yaptıklarımız açık. Aradaki farkı rahat bir şekilde görebilmemiz için
döngüyü uzun tuttum sadece.
CalculatorParallel()
adlı metodumuzda ise Calculator() adlı metodumuzun içerisindeki aynı işlemleri
yaptık.Programımızı çalıştıralım ve System.Threading.Tasks isim uzayı altında
bulunan paralel for döngümüs klasik for döngüsünden ne kadar hızlıymış görelim
Arada hemen hemen 25
kat fark var görüldüğü gibi. Peki arka planda neler oluyor? İki ayrı metod için
işlemcilerin çalışma yüzdelerine bakalım. Klasik for döngüsü için;
Sıra, paralel for
döngüsünde;
Her iki resimde de
sol üstte görüleceği gibi alışkın
olduğumuz for döngüsü bu işlem için işlemcimizin %23 ünü kullanırken paralel
olarak işleyen for döngümüz işlemcimizin %100 ünü kulanmakta.
Evet
arkadaşlar,böylece uzun süren döngülerimizi çok kolay bir şekilde çok daha
hızlı işletebilmekteyiz.Tabii bunun foreach için olanı da var. Aynı mantık ile
çalıştığı için burada ele almıyorum.Ayrıntılı bilgiyi MSDN den bulabilmeniz
mümkün. Umarım faydalı olmuştur
Uygulama Kodları :
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ForAndParallel { class Program { static void Main(string[] args) { Calculator(); CalculatorParallel(); Console.ReadKey(); } static void Calculator() { double sonuc = 0; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 999999999; i++) { sonuc += Convert.ToDouble(Math.Sin(i) / Math.Cos(i)); } sw.Stop(); Console.WriteLine("Paralel Olmayan İşlemin bitme süresi : " + sw.Elapsed.TotalMilliseconds.ToString()); } static void CalculatorParallel() { double sonuc = 0; Stopwatch sw = new Stopwatch(); sw.Start(); Parallel.For(0, 99999999, i => { sonuc += Convert.ToDouble(Math.Sin(i) / Math.Cos(i)); }); sw.Stop(); Console.WriteLine("Paralel İşlemin Tamamlanma Süresi : " + sw.Elapsed.TotalMilliseconds.ToString()); } } }
3 yorum :
Soru Görüş önerileriniz için gmail plus üzerinden + layın müsait olduğumda mutlaka yanıt dönüyor olacağım.
Kaydol:
Kayıt Yorumları
(
Atom
)
merhaba,
YanıtlaSilbu yöntem iç içe döngülerde de aynı şekilde mi kullanılıyor, yoksa en dıştaki döngüde olması yeterli midir?
Merhaba Öncelikle döngü mantığı gereği en içteki kısımdan başlar daha sonrasında tamamlandığında bir üstteki döngüye girer tabi kodlama esnasında döngüden çık komutları kullanılmadıysa.
YanıtlaSilGayet başarılı bir örnek, teşekkür ederim. Benim işimi gördü, bir de iç içe for döngüsünde yada foreach döngüsünde benzer örnekler yaparsanız daha çok kişiye daha çok yardımcı olursunuz. Emeğinize sağlık kolay gelsin.
YanıtlaSil