วิธีทำงานกับ Parallel LINQ ใน C #

Language Integrated Query หรือที่เรียกว่า LINQ เป็นไปป์ไลน์การดำเนินการสืบค้นที่เพิ่มความสามารถในการสืบค้นให้กับภาษาที่กำหนดเป้าหมายในสภาพแวดล้อมที่มีการจัดการของ. Net Parallel LINQ หรือ PLINQ เป็นเอ็นจิ้นการดำเนินการสืบค้นที่ทำงานบนสภาพแวดล้อมที่มีการจัดการของ. Net และใช้ประโยชน์จากโปรเซสเซอร์หรือคอร์หลายตัวในระบบคอมพิวเตอร์ของคุณเพื่อดำเนินการสืบค้นพร้อมกัน กล่าวอีกนัยหนึ่งก็คือช่วยให้คุณสามารถเพิ่มประสิทธิภาพการสืบค้นของคุณโดยการแยกออกเป็นส่วน ๆ เพื่อดำเนินการส่วนเหล่านี้ควบคู่กันไปและด้วยเหตุนี้จึงช่วยเพิ่มประสิทธิภาพการสืบค้น

PLINQ เป็นส่วนขยายของ LINQ และได้รับการแนะนำให้ใช้เป็นส่วนหนึ่งของ. Net Framework 4 ซึ่งเป็นกลไกการดำเนินการสืบค้นจาก Microsoft และเป็นส่วนหนึ่งของไลบรารีส่วนขยายแบบขนาน Parallel Extensions Library ประกอบด้วย TPL (Task Parallel Library) และ PLINQ Microsoft ได้ให้การสนับสนุนสำหรับการเขียนโปรแกรมแบบขนานใน. Net Framework เพื่อใช้ประโยชน์จากระบบมัลติคอร์ เพื่อใช้ประโยชน์จากความสามารถในการเขียนโปรแกรมแบบขนานคลาสใหม่ที่เรียกว่า Parallel จึงถูกนำมาใช้ใน. Net Framework 4

PLINQ เป็นตัวเลือกที่ดีในการดำเนินการที่เชื่อมโยงกับการประมวลผล แต่มันคืออะไรและปัญหาที่สามารถแก้ไขได้คืออะไร? เหมาะสมหรือไม่ที่จะใช้แทน LINQ เมื่อใดก็ตามที่เราต้องการสืบค้นข้อมูล เราจะพูดถึงสิ่งเหล่านี้ทั้งหมดในอีกสักครู่ แต่ก่อนอื่นเรามาทำความเข้าใจว่า PLINQ ทำงานเบื้องหลังอย่างไร PLINQ ทำงานโดยแบ่งแหล่งที่มาของข้อมูลหรืออินพุตเป็นกลุ่มซึ่งจะดำเนินการโดยเธรดที่แตกต่างกัน

ตอนนี้รหัสเล็กน้อย

พิจารณาแบบสอบถาม LINQ ต่อไปนี้

var data = from e in employees

           where e.FirstName.StartsWith("J")

           select e;

คุณสามารถแปลงแบบสอบถามข้างต้นเป็นแบบสอบถาม PLINQ ได้อย่างง่ายดายโดยใช้วิธีการขยาย AsParallel โปรดสังเกตว่า AsParallel เป็นวิธีการส่วนขยายของคลาส System.Linq.ParallelEnumerable

var data = from e in employees.AsParallel()

           where e.FirstName.StartsWith("J")

           select e;

หากคุณต้องการรักษาลำดับของผลลัพธ์คิวรีคุณสามารถใช้ประโยชน์จากเมธอด AsOreled

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

           where e.FirstName.StartsWith("J")

           select e;

คุณยังสามารถรักษาลำดับของข้อมูลที่ส่งคืนอันเป็นผลมาจากการดำเนินการเคียวรี PLINQ โดยส่ง QueryOptions.PreserveOrdering เป็นพารามิเตอร์ไปยังเมธอด AsParallel

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

           where e.FirstName.StartsWith("J")

           select e;

โปรดทราบว่าการใช้วิธี AsParallel () ไม่แนะนำให้ใช้กับคอลเล็กชันขนาดเล็ก แต่จะทำงานช้ากว่าเมื่อเทียบกับแบบสอบถามปกติ จะเกิดอะไรขึ้นถ้าคุณต้องการบังคับให้ขนานกัน? ไม่แนะนำ แต่คุณสามารถใช้ประโยชน์จากวิธีการขยาย WithExecutionMode เพื่อให้บรรลุสิ่งนี้ นี่คือตัวอย่างที่แสดงให้เห็นถึงสิ่งนี้

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

                (ParallelExecutionMode.ForceParallelism)

           where e.FirstName.StartsWith("J")

           select e;

โปรดสังเกตว่า ParallelExecutionMode เป็นการแจงนับที่พร้อมใช้งานเป็นส่วนหนึ่งของเนมสเปซ System.Linq และสามารถมีค่าใดค่าหนึ่งเหล่านี้: ค่าเริ่มต้นและ ForceParallelism หากคุณระบุค่าเริ่มต้นเป็นพารามิเตอร์สำหรับเมธอดส่วนขยาย WithExecutionMode PLINQ จะดำเนินการค้นหาควบคู่กันไปหากเห็นได้ชัดว่ามีการปรับปรุงประสิทธิภาพในการเรียกใช้แบบสอบถามควบคู่กันไป ถ้าไม่ PLINQ จะดำเนินการค้นหาเช่นเดียวกับการสืบค้น LINQ ในทางตรงกันข้ามถ้าคุณระบุ ForeParallelism เป็นพารามิเตอร์สำหรับวิธีการขยาย WithExecutionMode PLINQ จะดำเนินการค้นหาพร้อมกันแม้ว่า migh นั้นจะมีโทษด้านประสิทธิภาพก็ตาม

ฉันจะ จำกัด ระดับของความขนานได้อย่างไร

นอกจากนี้คุณควรตระหนักถึงแนวคิดอื่นที่เกี่ยวข้อง: ระดับของความเท่าเทียมกัน นี่คือจำนวนเต็มที่ไม่ได้ลงชื่อซึ่งแสดงถึงจำนวนตัวประมวลผลสูงสุดที่แบบสอบถาม PLINQ ของคุณควรใช้ประโยชน์ในขณะที่ดำเนินการ กล่าวอีกนัยหนึ่งระดับของการขนานคือจำนวนเต็มที่แสดงถึงจำนวนงานสูงสุดที่จะดำเนินการพร้อมกันเพื่อประมวลผลแบบสอบถาม

อนึ่งค่าเริ่มต้นของระดับความขนานคือ 64 ซึ่งหมายความว่า PLINQ สามารถใช้ประโยชน์จากโปรเซสเซอร์สูงสุด 64 ตัวในระบบของคุณ นี่คือวิธีที่คุณสามารถ จำกัด ระดับความขนานใน PLINQ ไว้ที่โปรเซสเซอร์สองตัวในระบบของคุณ

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

           where e.FirstName.StartsWith("J")

           select e;

สังเกตว่าจำนวนตัวประมวลผลถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังเมธอด WithDegreeofParallelism อย่างไร คุณควรระบุค่าที่สูงกว่าสำหรับระดับของความขนานเพื่อให้ได้ประสิทธิภาพที่เพิ่มขึ้นหากการสืบค้นของคุณดำเนินการที่ไม่มีการคำนวณที่ถูกผูกไว้มากขึ้นนั่นคืองานที่ไม่ได้เชื่อมต่อกับ CPU

ฉันขอแนะนำอย่างยิ่งให้อ่านเอกสาร "Patterns of Parallel Programming" โดย Stephen Toub เป็นการอภิปรายเชิงลึกเกี่ยวกับรูปแบบการเขียนโปรแกรมแบบขนานใน. Net