Cara bekerja dengan Parallel LINQ di C #

Language Integrated Query, juga dikenal sebagai LINQ, adalah pipeline eksekusi kueri yang menambahkan kapabilitas kueri ke bahasa yang ditargetkan di lingkungan terkelola .Net. Parallel LINQ, atau PLINQ, adalah mesin eksekusi kueri yang berjalan di atas lingkungan terkelola .Net dan memanfaatkan beberapa prosesor atau inti dalam sistem komputer Anda untuk menjalankan kueri secara paralel. Dengan kata lain, ini memungkinkan Anda untuk mengoptimalkan kueri Anda dengan membaginya menjadi beberapa bagian untuk menjalankan bagian ini secara paralel dan karenanya meningkatkan kinerja kueri.

PLINQ adalah ekstensi untuk LINQ dan diperkenalkan sebagai bagian dari .Net Framework 4. Ini adalah mesin eksekusi kueri dari Microsoft dan merupakan bagian dari Perpustakaan Ekstensi Paralel. Perpustakaan Ekstensi Paralel pada gilirannya terdiri dari TPL (Task Parallel Library) dan PLINQ. Microsoft telah menyediakan dukungan untuk pemrograman paralel di .Net Framework untuk memanfaatkan keunggulan sistem multi inti. Untuk memanfaatkan kemampuan pemrograman paralel, kelas baru yang disebut Paralel diperkenalkan di .Net Framework 4.

PLINQ adalah pilihan yang baik dalam operasi terikat komputasi. Tapi, tentang apa itu semua dan masalah apa yang bisa dipecahkannya? Apakah tepat untuk menggunakannya sebagai pengganti LINQ setiap kali kita perlu melakukan kueri data? Kami akan membahas semua ini sebentar lagi, tetapi pertama-tama mari kita pahami cara kerja PLINQ di balik layar. PLINQ bekerja dengan mempartisi sumber data atau input menjadi potongan-potongan yang pada gilirannya dijalankan oleh utas yang berbeda.

Sedikit kode sekarang

Pertimbangkan kueri LINQ berikut.

var data = from e in employees

           where e.FirstName.StartsWith("J")

           select e;

Anda dapat mengubah kueri di atas dengan mudah menjadi kueri PLINQ dengan menggunakan metode ekstensi AsParallel. Perhatikan bahwa AsParallel adalah metode ekstensi dari kelas System.Linq.ParallelEnumerable.

var data = from e in employees.AsParallel()

           where e.FirstName.StartsWith("J")

           select e;

Jika Anda ingin mempertahankan urutan hasil kueri, Anda bisa memanfaatkan metode AsOrdered.

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

           where e.FirstName.StartsWith("J")

           select e;

Anda juga dapat mempertahankan urutan data yang dikembalikan sebagai hasil eksekusi kueri PLINQ dengan meneruskan QueryOptions.PreserveOrdering sebagai parameter ke metode AsParallel.

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

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bahwa menggunakan metode AsParallel () tidak dianjurkan pada koleksi kecil - lebih baik berjalan lebih lambat dibandingkan dengan kueri normal. Bagaimana jika Anda ingin memaksakan paralelisme? Ini tidak disarankan tetapi Anda dapat memanfaatkan metode ekstensi WithExecutionMode untuk mencapai ini. Berikut adalah contoh yang menggambarkan hal ini.

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

                (ParallelExecutionMode.ForceParallelism)

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bahwa ParallelExecutionMode adalah enumerasi yang tersedia sebagai bagian dari namespace System.Linq dan dapat memiliki salah satu dari nilai berikut: Default dan ForceParallelism. Jika Anda menentukan Default sebagai parameter untuk metode ekstensi WithExecutionMode, PLINQ akan mengeksekusi kueri secara paralel jika peningkatan kinerja terbukti dalam mengeksekusi kueri secara paralel. Jika tidak, PLINQ akan mengeksekusi kueri seperti kueri LINQ. Sebaliknya, jika Anda menentukan ForeParallelism sebagai parameter untuk metode ekstensi WithExecutionMode, PLINQ akan mengeksekusi kueri secara paralel bahkan jika hal itu menimbulkan penalti kinerja.

Bagaimana cara membatasi derajat paralelisme?

Anda juga harus mengetahui konsep terkait lainnya: derajat paralelisme. Ini adalah bilangan bulat tak bertanda yang menunjukkan jumlah maksimum prosesor yang harus dimanfaatkan oleh kueri PLINQ Anda saat sedang dieksekusi. Dengan kata lain, derajat paralelisme adalah bilangan bulat yang menunjukkan jumlah maksimum tugas yang akan dijalankan secara bersamaan untuk memproses kueri.

Kebetulan, nilai default derajat paralelisme adalah 64 yang menyiratkan bahwa PLINQ dapat memanfaatkan maksimal 64 prosesor di sistem Anda. Inilah cara Anda membatasi derajat paralelisme di PLINQ ke dua prosesor di sistem Anda.

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

           where e.FirstName.StartsWith("J")

           select e;

Perhatikan bagaimana jumlah prosesor telah diteruskan sebagai argumen ke metode WithDegreeofParallelism. Anda harus menentukan nilai yang lebih tinggi untuk derajat paralelisme untuk peningkatan kinerja jika kueri Anda melakukan lebih banyak pekerjaan yang tidak terikat komputasi, yaitu, pekerjaan yang tidak terikat dengan CPU.

Saya sangat merekomendasikan membaca dokumen "Patterns of Parallel Programming" oleh Stephen Toub. Ini memberikan diskusi mendalam tentang pola pemrograman paralel di .Net.