รู้จักกับ .NET PLINQ เขียน parallel programming กระจายงาน แล้วทำงานให้… อย่างไว!

เขียนน้อยที่สุด ให้ผลมากที่สุด

ก็เป็นที่รู้กันแล้วนะครับว่าในปัจุบันทั้ง PC และ มือถือธรรมดาที่ขายตามท้องตลาดทั่วไปมี CPU แบบหลาย Core แล้วและในอนาคตก็จะเพิ่ม Core ไปเรื่องๆอีก นั่นหมายความว่ามันสนับสนุน process แบบ parallel ได้ หน้าที่ของเราก็คือประดิษฐ์ software ที่ใช้ความสามารถหลายๆ Core ของ CPU นี้ได้อย่างไรเท่านั้นเอง

และบทความนี้ผมจะแนะนำให้รู้จักหนทางที่ง่ายสุดๆในตอนนี้ที่จะ Parallel Programming โดยใช้แค่ method AsParallel() ของ PLINQ ใน loop ของ code คุณเท่านั้น สมมติตอนนี้ผมมีแนวคิดทางคณิตศาสตร์ คำนวณ DoSomething โดยให้ทำงาน นานครั้งละ   100 มิลิวินาทีก็พอ แล้วให้ return ค่าเดิมออกมา ได้ code แบบนี้

public static class Mathematics

{

public static int DoSometing(int n)

{

Thread.Sleep(100);//จำลองว่าใช้เวลาไป 100 มิลิวินาที

return n;

}

}

ตัวอย่างของผมจะคำนวณผลรวมของ DoSometing จาก 1 – 100 ครับ ได้ code แบบนี้

[TestMethod]

public void TestSimpleDoSometing()

{

var answer = (from n in Enumerable.Range(1, 100) select Mathematics.DoSometing(n)).Sum();

Console.WriteLine(“Answer = {0}”, answer);//Answer = 5050

}

จาก code ด้านบนก็พอจะวิเคราะห์ได้ใช่มั้ยครับว่า ใช้เวลาเท่าไรงานนี้จึงจะเสร็จ
ใช่ครับ ใช้เวลาไป 100 ครั้งคูณกับ 100 มิลิวินาที เท่ากับ 10000 หรือ 10 วินาที(ทดลอง run ดูก็จะใช้เวลาประมาณ 10 วินาที)
พอนั่งวิเคราะห์อีกทีแล้ว อืมถ้าเรา กระจายงาน(parallel) Mathematics.DoSometing ให้ทำงานพร้อมๆกันจนเสร็จหมด แล้วเอาผลลัพย์มารวมกันละ งานนี้มันต้องเร็วขึ้นอีก อย่างน้อยต้องได้ 100 มิลิวินาทีเท่ากับงานที่ทำในแต่ละครั้งอย่างแน่นอน งั้นใช้ PLINQ กันเลยกับงานนี้

ผมกลับไปแก้ code ใหม่โดยใช้ AsParallel ใน loop ได้เป็น

[TestMethod]

public void TestSimpleDoSometing()

{

var answer = (from n in Enumerable.Range(1, 100).AsParallel() select Mathematics.DoSometing(n)).Sum();

Console.WriteLine(“Answer = {0}”, answer);//answer = 5050

}

พอ run ดูก็เร็วขึ้นจริงๆครับ แต่ไม่ใช่ 100 มิลิวินาทีอย่างที่คิดไว้นะครับ

อ่าวทำไมละ ก็ถ้าคิดโดยวิธีข้างต้น แล้วกระจายงานออกไป run พร้อมๆกันก็น่าจะได้ 100 มิลิวินาทีนี่ ตรงนี้เก็บไว้ให้คุณคิดเอง ว่าทำไมไม่ได้ 100 มิลิวินาที

จากเครื่องที่ผมใช้อยู่ตอนนี้ CPU มี 2 core ครับ(สามารถดู core ของ CPU ที่ค่านี้ Environment.ProcessorCount)ใช้เวลา 5 วินาที
แต่ถึงไม่ได้ 100 มิลิวินาที แต่ก็เร็วขึ้นตั้งครึ่งหนึ่งแล้ว แถมผมแค่เติม AsParallel() เข้าไปใน loop เท่านั้นเองง่ายมากเลย นี่ละ PLINQ
ไปลองทำดูนะครับว่าของคุณใช้เวลาเท่าไรๆ
ขอบคุณครับ 🙂

Advertisements

#net, #asp-net, #c