Odatiy bo'lib, LINQ-dagi to'plamning barcha elementlari ketma-ketlikda qayta ishlanadi, lekin .NET 4.0 dan boshlab, PLINQ (Parallel LINQ) funksiyasini o'z ichiga olgan va to'plamga parallel ravishda kirish imkonini beruvchi System.Linq nom maydoniga ParallelEnumerable sinfi qo'shildi.
To'plamni qayta ishlashda PLINQ tizimdagi barcha protsessorlarning imkoniyatlaridan foydalanadi. Ma'lumotlar manbai segmentlarga bo'linadi va har bir segment alohida yo'nalishda qayta ishlanadi. Bu so'rovni ko'p yadroli mashinalarda ancha tezroq bajarishga imkon beradi.
Shu bilan birga, PLINQ sukut bo'yicha ketma-ket ma'lumotlarni qayta ishlashni tanlaydi. Parallel ishlov berishga o'tish tezroq ishlashga olib keladigan taqdirda amalga oshiriladi. Biroq, qoida tariqasida, parallel operatsiyalar bilan qo'shimcha xarajatlar ko'payadi. Shuning uchun, agar parallel ishlov berish potentsial resurslarni talab qiladigan bo'lsa, unda PLINK katta resurslarni talab qilmasa, ketma-ket ishlashni tanlashi mumkin.
Shuning uchun, PLINQ-ni asosan katta kollektsiyalarda yoki murakkab operatsiyalarda ishlatish mantiqan to'g'ri keladi, bu erda so'rovlarni parallellashtirishdan olingan haqiqiy foyda xarajatlarni qoplashi mumkin.
Ushbu misol PLINQ-dan 1 dan 10000 gacha bo'lgan juft sonlarni hisoblashda qanday ishlatilishini ko'rsatadi. Bir nechta iplardan foydalangan holda 10000. E'tibor bering, natijada ro'yxat buyurtma qilinmaydi!
var ketma-ketligi = Enumable.Range (1, 10000);
var evenNumbers = ketma-ketlik.AsParallel ()
. (Qayerda (x => x% 2 == 0)
.To‘plam ();
// evenNumbers = {4, 26, 28, 30, ...}
// Buyurtma har xil versiyalarda o'zgaradi
DegreeOfParallelism bilan
Parallellik darajasi - bajariladigan vazifalarning maksimal bajarilish soni
so'rovni qayta ishlash uchun ishlatiladi.
var ketma-ketligi = Enumable.Range (1, 10000);
var evenNumbers = ketma-ketlik.AsParallel ()
Paralellik darajasi bilan. (4)
.Qaerda (x => x% 2 == 0);
AsOrdered
Ushbu misol PLINQ-dan 1 dan 1 gacha bo'lgan juft sonlarni hisoblashda qanday ishlatilishini ko'rsatadi
Bir nechta iplardan foydalangan holda 10000. Olingan ro'yxatda buyurtma saqlanadi, ammo yodda tuting
AsOrdered ko'plab elementlarning ishlashiga zarar etkazishi mumkin, shuning uchun buyurtma qilinmagan ishlov berish
iloji bo'lsa afzal ko'riladi.
var ketma-ketligi = Enumable.Range (1, 10000);
var evenNumbers = ketma-ketlik
.Ordered ()
. (Qayerda (x => x% 2 == 0)
.To‘plam ();
// evenNumbers = {2, 4, 6, 8, ..., 10000}
AsUnordered
Buyurtma qilingan ketma-ketliklar ko'p sonli elementlar bilan ishlashda ishlashga zarar etkazishi mumkin. Kimga
buni yumshatish uchun ketma-ket buyurtma kerak bo'lmaganda AsUnordered-ga qo'ng'iroq qilish mumkin.
var ketma-ketligi = Sanab bo'lmaydigan.Range (1, 10000) .Telefin (x => -1 * x); // -1, -2, ...
var evenNumbers = ketma-ketlik
.OrderBy (x => x)
.Tashlang (5000)
.AsUnordered ()
. (X => x% 2 == 0) // bu satr buyurtma orqali ta'sirlanmaydi
.To‘plam ();
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} равен {result}");
return result; }
Xulosa
Xulosa qilib shuni aytish mumkinki bu masalalarda Linq dasturlash tili bilan bog’liq vaziyatlarda obektiv yondashiladi. Shu boisdan yuqori tillardan farqi juda kattaligi bilan ajralib turadi. Shuning uchun har qaysi dasturlash tilida o’zining metodi bo’ladi. Mustaqil ishim davomida
Do'stlaringiz bilan baham: |