AsParallel usuli. AsParallel() usuli so'rovni ma'lumotlar manbasiga parallellashtirish imkonini beradi. U massivlar va to'plamlar uchun LINQ kengaytmasi usuli sifatida amalga oshiriladi. Ushbu usul chaqirilganda ma'lumotlar manbai qismlarga bo'linadi (agar iloji bo'lsa) va har bir qismda operatsiyalar alohida bajariladi.Raqamlarning faktoriallarini topishning eng oddiy misolini ko'rib chiqing:
static void Main(string[] args)
{
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
var factorials = from n in numbers.AsParallel()
select Factorial(n);
foreach (var n in factorials)
Console.WriteLine(n);
Console.ReadLine();
}
static int Factorial(int x)
{
int result = 1;
for (int i = 1; i <= x; i++)
{
result *= i;
}
Console.WriteLine($"{x} sonining faktoriali {result} ga teng.");
return result;
}
Aslida, bu oddiy LINQ so'rovi, ma'lumotlar manbasiga faqat AsParallel usuli qo'llaniladi.Dastur ishining natijasi faktorialni topish uchun ma'lumotlar ketma-ket tanlanmaganligini ko'rsatadi. Ya'ni, dasturning parallellashuvi mavjud edi:
1-rasm
Kengaytma usullaridan foydalangan holda shunga o'xshash operatsiya:
var factorials = numbers.AsParallel().Select(x => Factorial(x));
For All usuli. Faktorialni hisoblash uchun yuqoridagi kod parallellashtirish nuqtai nazaridan yanada optimallashtirilishi mumkin. Xususan, parallel amal natijasini ko'rsatish uchun foreach siklidan foydalaniladi. Ammo undan foydalanish xarajatlarning oshishiga olib keladi - turli xil oqimlarda olingan ma'lumotlarni bitta to'plamga yopishtirish va keyin ularni tsiklda takrorlash kerak. Bu holda, ma'lumotlarni qayta ishlangan oqimda chiqaradigan ForAll() usulidan foydalanish maqbulroq bo'ladi:
Do'stlaringiz bilan baham: |