Parallel.ForEach () vs. foreach (IEnumerable <T> .AsParallel ())


143

เอ๋อฉันพยายามค้นหาสองวิธีนี้ใน BCL โดยใช้ Reflector แต่หาไม่พบ ข้อแตกต่างระหว่างสองตัวอย่างนี้คืออะไร

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

มีผลที่แตกต่างจากการใช้อย่างใดอย่างหนึ่งมากกว่าอื่น ๆ ? (สมมติว่าสิ่งที่ฉันทำในเนื้อหาที่มีวงเล็บของทั้งสองตัวอย่างนั้นปลอดภัยสำหรับเธรด)

คำตอบ:


148

พวกเขาทำอะไรที่ค่อนข้างแตกต่าง

คนแรกใช้ผู้รับมอบสิทธิ์ที่ไม่ระบุชื่อและรันหลายเธรดในรหัสนี้ในแบบคู่ขนานสำหรับรายการที่แตกต่าง

อันที่สองไม่มีประโยชน์มากในสถานการณ์นี้ โดยสรุปแล้วมันมีจุดประสงค์ที่จะทำแบบสอบถามในหลายกระทู้และรวมผลลัพธ์และให้มันอีกครั้งเพื่อเรียกด้าย ดังนั้นรหัสในคำสั่ง foreach จะยังคงอยู่ในเธรด UI เสมอ

มันสมเหตุสมผลถ้าคุณทำบางอย่างแพงในแบบสอบถาม linq ทางด้านขวาของการAsParallel()โทรเช่น:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));

ประโยชน์ที่ได้จากการทำหน้าคู่ขนานบน computefibonacci คืออะไร
l

51

ความแตกต่างคือ B ไม่ขนานกัน สิ่งเดียวที่AsParallel()ทำได้คือมันล้อมรอบ a IEnumerableดังนั้นเมื่อคุณใช้เมธอด LINQ จะใช้ตัวแปรแบบขนาน กระดาษห่อของGetEnumerator()(ซึ่งถูกนำมาใช้อยู่เบื้องหลังในส่วนforeach) GetEnumerator()แม้ผลตอบแทนของคอลเลกชันของเดิม

BTW ถ้าคุณต้องการดูวิธีการใน Reflector AsParallel()อยู่ใน System.Linq.ParallelEnumerableคลาสในSystem.Coreชุดประกอบ Parallel.ForEach()อยู่ในmscorlibชุดประกอบ (เนมสเปซSystem.Threading.Tasks)


คุณหมายถึงอะไรโดย ... ใช้ตัวแปรขนานของพวกเขา ... ?
l

2
@punctuation ที่ยกตัวอย่างเช่นเมื่อคุณเขียน.Select()มันเรียกและไม่ปกติParallelEnumerable.Select() Enumerable.Select()
svick

50

วิธีที่สองจะไม่ขนานวิธีที่ถูกต้องในการใช้ AsParallel () ในตัวอย่างของคุณจะเป็น

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});

3
เหตุใดจึงใช้การรวมกันของ asparallel และ forall แทนที่จะเป็น foreach อย่างเดียว?
l
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.