C# - Parallel.ForEach Kullanımı

Parallel.ForEach Nedir?

C#'ta özellikle listeler ve dizilerde işlem yapacağımız zaman sıklıkla kullandığımız foreach döngüsünün çalışma mantığına benzer olan bir de Parallel.ForEach döngüsü vardır. Klasik foreach'ten farkı, dizi elemanlarını sıra ile dönmek yerine tüm elemanları paralel task'lar oluşturup (CPU çekirdekleri uygun olduğu kadar) aynı anda işlenmesini sağlar. 

 

Parallel.ForEach Nasıl Kullanılır?

System.Threading.Tasks namespace'i kullanacağımız zaman kodumuza referans olarak eklmemiz gerekir.

Döngüye uygun, tüm veri tiplerinde kullanabiliriz.

var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Parallel.ForEach(numbers, num =>
{
    Console.WriteLine(num);
}); 

Yukarıdaki kodda 10 tane sayı içeren dizimizi Parallel.ForEach yardımıyla ekrana yazdırdık. Çıkan sonuca baktığımızda klasik döngülerden farklı olarak ekrana sayıları sıralı şekilde değil, paralel taskların tamamlanma sırasına göre yazdırıldığını göreceksiniz. 

Kodu her çalıştırdığınızda farklı ekrana yazdırma sırası görürsünüz.

 

 

Ne zaman Parallel.ForEach Kullanmalıyız?

1. Bu döngünün sihirli bir kod satırı olduğunu kesinlikle düşünmemelisiniz. Çünkü klasik foreach'e göre aşırı yavaş kaldığı durumlar da olabilmekte. O koddaki senaryonuza göre dikkatli bir şekilde kullanmalısınız. Örneğin yukarıdaki gibi az elemanlı sabit bir dizinin elemanlarını ekrana yazdırmak için kullanılması pek tavsiye edilmez. Sadece kod syntax'ını basit şekilde anlatmak için bu şekilde gösterdim. 

2. Büyük veri(Big Data) ile işlemler yapıyarsanız, binlik, milyonluk listelerde çalışmanız gerekiyorsa tercih edebilirsiniz.

3. Liste veya diz içindeki kayıtlarının sırasının bir önemi yoksa, her bir kayıt birbirinden bağımsız işlenebilirse tercih edebilirsiniz. (1 ve 2. maddeki koşulları da gözeterek)

4.Ortak paylaşılan bir veriye erişim yoksa tercih edilebilir. Eğer döngü içerisinde ortak bir sınıfa,db'yi vs kullanıyorsanız aynı anda bu veriye erişmeye çalışmak sistemde çakışmalara yol açabilir veya bu kadar isteği kaldırmayabilir. 

5. Döngü içerisinde yeni obje ve büyük değişkenler oluşturmuyorsanız tercih edilebilir. Diğer türlü aynı anda bu objeleri oluşturmak bellekte ani ve yüksek bir alan ihtiyacı oluşturacağı için sistem belleği bu yükü kaldıramayabilir.

6. Döngü içindeki elemanların işlenme sıralarının bir önemi yoksa tercih edilebilir. (önceki maddeleri de dikkate alarak)


Sonuç olarak, Parallel.ForEach, büyük döngülerde kodunuzu hızlandırabilecek önemli bir alternatif olabilir, ancak yanlış kullanıldığında kodunuzu yavaşlatabilir ve hatta sistemde kitlenmelere yol açabilir. Kodunuzdaki durumu değerlendirip bilinçli bir şekilde kullanıldığında ciddi performans artışları sağlayabilir. Bu nedenle, ihtiyacınıza ve projenizin gereksinimlerine göre foreach veya Parallel.ForEach'i tercih etmelisiniz.

 

Add comment