Cara bekerja dengan Paralel LINQ di C #

Language Integrated Query, juga dikenal sebagai LINQ, adalah saluran pelaksanaan pelaksanaan yang menambahkan kemampuan pertanyaan pada bahasa yang disasarkan pada lingkungan yang dikelola .Net. Paralel LINQ, atau PLINQ, adalah enjin pelaksanaan pertanyaan yang berjalan di atas persekitaran yang diuruskan. Bersih dan memanfaatkan pelbagai pemproses atau teras dalam sistem komputer anda untuk melaksanakan pertanyaan secara selari. Dengan kata lain, ini membolehkan anda mengoptimumkan pertanyaan anda dengan membelahnya menjadi beberapa bahagian sehingga dapat melaksanakan bahagian-bahagian ini secara selari dan dengan itu meningkatkan prestasi pertanyaan.

PLINQ adalah lanjutan untuk LINQ dan diperkenalkan sebagai bagian dari .Net Framework 4. Ini adalah enjin pelaksanaan pertanyaan dari Microsoft dan merupakan bagian dari Parallel Extensions Library. Perpustakaan Sambungan Selari pula terdiri daripada TPL (Perpustakaan Selari Tugas) dan PLINQ. Microsoft telah memberikan sokongan untuk pengaturcaraan selari dalam .Net Framework untuk memanfaatkan kelebihan sistem pelbagai teras. Untuk memanfaatkan keupayaan pengaturcaraan selari, kelas baru yang disebut Parallel diperkenalkan dalam .Net Framework 4.

PLINQ adalah pilihan yang baik dalam operasi komputer. Tetapi, apa masalahnya dan apa masalah yang dapat diselesaikan? Adakah tepat untuk menggunakannya sebagai pengganti LINQ setiap kali kita memerlukan pertanyaan? Kami akan membincangkan semua ini dalam sekejap tetapi mari kita fahami terlebih dahulu bagaimana PLINQ berfungsi di belakang tabir. PLINQ berfungsi dengan mempartisi sumber data atau input ke dalam potongan yang seterusnya dijalankan oleh utas yang berbeza.

Sedikit kod sekarang

Pertimbangkan pertanyaan LINQ berikut.

var data = from e in employees

           where e.FirstName.StartsWith("J")

           select e;

Anda boleh menukar pertanyaan di atas dengan mudah menjadi pertanyaan PLINQ dengan menggunakan kaedah peluasan AsParallel. Perhatikan bahawa AsParallel adalah kaedah lanjutan dari kelas System.Linq.ParallelEnumerable.

var data = from e in employees.AsParallel()

           where e.FirstName.StartsWith("J")

           select e;

Sekiranya anda ingin mengekalkan urutan hasil pertanyaan, anda boleh memanfaatkan kaedah AsOrdered.

var data = from e in employees.AsParallel().AsOrdered()

           where e.FirstName.StartsWith("J")

           select e;

Anda juga dapat menjaga urutan data yang dikembalikan sebagai hasil pelaksanaan pertanyaan PLINQ dengan meneruskan QueryOptions.PreserveOrdering sebagai parameter kepada kaedah AsParallel.

var data = from e in employees.AsParallel(QueryOptions.PreserveOrdering)

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bahawa menggunakan kaedah AsParallel () tidak disarankan pada koleksi kecil - ia lebih baik berjalan lebih lambat berbanding dengan pertanyaan biasa. Bagaimana jika anda mahu memaksa paralelisme? Ini tidak digalakkan tetapi anda boleh memanfaatkan kaedah peluasan WithExecutionMode untuk mencapainya. Inilah contoh yang menggambarkan perkara ini.

var data = from e in employees.AsParallel().WithExecutionMode

                (ParallelExecutionMode.ForceParallelism)

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bahawa ParallelExecutionMode adalah penghitungan yang tersedia sebagai sebahagian daripada ruang nama System.Linq dan boleh mempunyai salah satu nilai ini: Default dan ForceParallelism. Sekiranya anda menentukan Default sebagai parameter untuk kaedah peluasan WithExecutionMode, PLINQ akan menjalankan pertanyaan secara selari jika peningkatan prestasi terbukti dalam melaksanakan permintaan secara selari. Sekiranya tidak, PLINQ akan melaksanakan pertanyaan seperti pertanyaan LINQ. Sebaliknya, jika anda menentukan ForeParallelism sebagai parameter untuk kaedah peluasan WithExecutionMode, PLINQ akan menjalankan pertanyaan secara selari walaupun itu mungkin dikenakan penalti prestasi.

Bagaimana saya mengehadkan tahap paralelisme?

Anda juga harus mengetahui konsep lain yang berkaitan: tahap kesejajaran. Ini adalah nombor bilangan bulat yang tidak ditandatangani yang menunjukkan bilangan maksimum pemproses yang harus dimanfaatkan oleh pertanyaan PLINQ anda semasa ia dijalankan. Dengan kata lain, tahap paralelisme adalah bilangan bulat yang menunjukkan jumlah tugas maksimum yang akan dilaksanakan secara serentak untuk memproses pertanyaan.

Secara kebetulan, nilai lalai tahap paralelisme adalah 64 yang menunjukkan bahawa PLINQ dapat memanfaatkan maksimum 64 pemproses di sistem anda. Inilah cara anda dapat mengehadkan tahap kesejajaran dalam PLINQ kepada dua pemproses dalam sistem anda.

var data = from e in employees.AsParallel().WithDegreeOfParallelism(2)

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bagaimana jumlah pemproses telah diserahkan sebagai hujah kepada kaedah WithDegreeofParallelism. Anda harus menentukan nilai yang lebih tinggi untuk tahap paralelisme untuk peningkatan prestasi jika pertanyaan anda melakukan lebih banyak terikat bukan komputasi, iaitu, kerja tanpa CPU.

Saya sangat mengesyorkan membaca dokumen "Pola Pengaturcaraan Sejajar" oleh Stephen Toub. Ini memberikan perbincangan mendalam mengenai corak pengaturcaraan selari di .Net.