Parallel For Kullanımı C#

3 yorum


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(099999999, 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 :

  1. merhaba,
    bu 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?

    YanıtlaSil
  2. 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ıtlaSil
  3. Gayet 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

Soru Görüş önerileriniz için gmail plus üzerinden + layın müsait olduğumda mutlaka yanıt dönüyor olacağım.