|
โค้ดชุดนี้นำเสนอการใช้ Parallel Programming ใน .NET เพื่อประมวลผลลูปซ้อน (Nested Loop) โดยสามารถใช้ Parallel.For และ Parallel.ForEach ซึ่งเป็นส่วนหนึ่งของ System.Threading.Tasks เพื่อกระจายการประมวลผลไปยังหลายๆคอร์ของ CPU ได้ ... โค้ดชุดนี้จะแสดงตัวอย่างวิธีการทำ Parallel Programming ในการหาค่าสามเหลี่ยมพีทาโกรัสด้วยการใช้ Parallel.For ในการประมวลผลลูปซ้อน ช่วยเพิ่มประสิทธิภาพในการหาสามเหลี่ยมพีทาโกรัสและเป็นวิธีที่ดีในการใช้ประโยชน์จากการทำงานแบบขนานใน .NET
ประโยชน์ของ Parallel Programming:
- เพิ่มประสิทธิภาพการทำงาน: การทำงานแบบขนานทำให้สามารถประมวลผลได้เร็วขึ้นโดยใช้หลายๆคอร์ของ CPU
- การใช้ทรัพยากร CPU อย่างมีประสิทธิภาพ: ช่วยลดการใช้ทรัพยากร CPU ของ Thread เดียวที่อาจทำให้การทำงานของระบบช้าลง
นอกจากนี้แอดมินได้เพิ่มเติมเรื่อง Lambda Expression เข้ามาช่วยในเรื่องของการเปรียบเทียบค่า เพื่อทำการจัดลำดับข้อมูลให้เรียงจากน้อยไปหามากด้วย ...
ข้อมูลเพิ่มเติม ...
'// Parallel programming in .NET: A guide to the documentation.
'// Data Parallelism (Task Parallel Library)
'// How to: Write a Simple Parallel.For Loop
มาดูโค้ดฉบับเต็มกันเถอะ ...
- Imports System.Threading
- Imports System.Threading.Tasks
- Public Class frmPythagorasParallel
- '/ Start-Stop Timer
- Private mTimeDouble As Double
- Private sWatch As New Stopwatch()
- Private Sub frmThreadNestedLoop_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- '// วนลูปผ่านคอนโทรลทั้งหมดบนฟอร์ม
- For Each ctrl As Control In Me.Controls
- '// ตรวจสอบว่าคอนโทรลเป็น Label หรือไม่
- If TypeOf ctrl Is Label Then
- '// ตั้งค่าข้อความของ Label เป็นค่าว่าง
- CType(ctrl, Label).Text = String.Empty
- End If
- Next
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / การใช้ LINQ ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
- ' / Pythagorean Triplets ที่เป็นเลขจำนวนเต็มทั้งหมดที่จะเป็นไปได้ดังนี้
- ' / -------------------------------------------------------------------------------------------------
- Private Sub btnLinq_Click(sender As System.Object, e As System.EventArgs) Handles btnLinq.Click
- Call InitializeListView(ListView1)
- '// สร้าง ListViewItem เพื่อเก็บข้อมูล
- Dim items As New List(Of ListViewItem)
- Dim MaxValue As Integer = 100
- sWatch.Reset()
- sWatch.Start()
- Cursor = Cursors.WaitCursor
- ' / -------------------------------------------------------------------------------------------------
- ' / LINQ ให้เริ่มนับ b = 1
- Dim PythagoreanTriple =
- From a In Enumerable.Range(1, MaxValue)
- From b In Enumerable.Range(1, MaxValue)
- Let c = Math.Sqrt(a * a + b * b)
- Where (c = Math.Floor(c) AndAlso c <= MaxValue)
- Select New With {a, b, c}
- ' / -------------------------------------------------------------------------------------------------
- For Each triplet In PythagoreanTriple
- '// สำหรับ ListView Control
- Dim NewItem As New ListViewItem(triplet.a) '// กำหนดค่าให้กับคอลัมน์แรก
- NewItem.SubItems.Add(triplet.b) ' เพิ่มค่าในคอลัมน์ที่สอง
- NewItem.SubItems.Add(triplet.c) ' เพิ่มค่าในคอลัมน์ที่สาม
- items.Add(NewItem)
- Next
- '// แสดงผลลัพธ์ใน ListView Control
- ListView1.Items.AddRange(items.ToArray())
- Cursor = Cursors.Default
- sWatch.Stop()
- mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
- lblTimerLinq.Text = "เวลา LINQ : " & mTimeDouble.ToString & " sec."
- lblCountLinq.Text = "จำนวน : " & Format(ListView1.Items.Count, "#,##")
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / การใช้ Parallel.For ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
- ' / -------------------------------------------------------------------------------------------------
- Private Sub btnParallelOne_Click(sender As System.Object, e As System.EventArgs) Handles btnParallelOne.Click
- Call InitializeListView(ListView2)
- '// สร้าง ListViewItem เพื่อเก็บข้อมูล
- Dim items As New List(Of ListViewItem)
- Dim MaxValue As Integer = 101
- Dim Count As Integer = 0
- sWatch.Reset()
- sWatch.Start()
- Cursor = Cursors.WaitCursor
- '// Parallel Programming .NET
- '// สร้างตัวแปร results: เป็น List แบบ Tuple สำหรับเก็บผลลัพธ์ของชุดสามเหลี่ยมพีทาโกรัส
- Dim results As New List(Of Tuple(Of Integer, Integer, Integer))
- '// สร้างตัวแปร lock: ใช้สำหรับการป้องกันการเข้าถึงพร้อมกัน (Synchronization) ของหลายเธรด
- Dim lock As New Object()
- '// Parallel.For: ใช้เพื่อดำเนินการวนลูปแบบขนาน โดยในแต่ละรอบของลูปจะทำงานในเธรดต่างๆ
- Parallel.For(1, MaxValue, Sub(a)
- Parallel.For(1, MaxValue, Sub(b)
- Parallel.For(1, MaxValue, Sub(c)
- If a * a + b * b = c * c Then
- SyncLock lock '// ป้องกันการเข้าถึงพร้อมกัน
- '// สร้าง List ของทูเพิล (Tuple)
- results.Add(Tuple.Create(a, b, c))
- Count += 1
- End SyncLock
- End If
- End Sub)
- End Sub)
- End Sub)
- Cursor = Cursors.Default
- sWatch.Stop()
- mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
- lblTimerParallelOne.Text = "เวลา Pararllel I : " & mTimeDouble.ToString & " sec."
- '// ใช้ Lambda expression เพื่อสร้างฟังก์ชันเปรียบเทียบในตัว
- '// Function(x, y): นี่คือฟังก์ชันเปรียบเทียบที่กำหนดเองในรูปแบบของ Lambda expression
- '// ซึ่งใช้เพื่อเปรียบเทียบองค์ประกอบสองตัวในรายการที่กำลังจัดเรียง ฟังก์ชันนี้มีสองพารามิเตอร์ x และ y ซึ่งแทนทูเพิลสองตัวที่กำลังเปรียบเทียบ
- '// x.Item1.CompareTo(y.Item1): เมธอด CompareTo ใช้เพื่อเปรียบเทียบค่าในฟิลด์ Item1 ของทูเพิล x กับค่าในฟิลด์ Item1 ของทูเพิล y
- '// ถ้าค่า Item1 ของ x น้อยกว่าค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็นค่าลบ
- '// ถ้าค่า Item1 ของ x เท่ากับค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็น 0
- '// ถ้าค่า Item1 ของ x มากกว่าค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็นค่าบวก
- '// โค้ดในการจัดเรียงข้อมูลตามคอลัมน์แรก
- results.Sort(Function(x, y) x.Item1.CompareTo(y.Item1))
- '// จัดเรียงข้อมูลตาม 2 หลักแรก
- 'results.Sort(Function(x, y)
- 'Dim comp1 = x.Item1.CompareTo(y.Item1)
- 'If comp1 <> 0 Then Return comp1
- 'Return x.Item2.CompareTo(y.Item2)
- ' End Function)
- '// จัดเรียงข้อมูลตาม 3 หลักแรก
- 'results.Sort(Function(x, y)
- 'Dim comp1 = x.Item1.CompareTo(y.Item1)
- 'If comp1 <> 0 Then Return comp1
- 'Dim comp2 = x.Item2.CompareTo(y.Item2)
- 'If comp2 <> 0 Then Return comp2
- 'Return x.Item3.CompareTo(y.Item3)
- ' End Function)
- For Each triplet In results
- '// สำหรับ ListView Control
- Dim NewItem As New ListViewItem(triplet.Item1) '// กำหนดค่าให้กับคอลัมน์แรก
- NewItem.SubItems.Add(triplet.Item2) ' เพิ่มค่าในคอลัมน์ที่สอง
- NewItem.SubItems.Add(triplet.Item3) ' เพิ่มค่าในคอลัมน์ที่สาม
- items.Add(NewItem)
- Next
- '// แสดงผลลัพธ์ใน ListView Control
- ListView2.Items.AddRange(items.ToArray())
- lblCountParallelOne.Text = "จำนวน : " & Format(Count, "#,##")
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / การใช้ Parallel.For ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
- ' / -------------------------------------------------------------------------------------------------
- Private Sub btnParallelTwo_Click(sender As System.Object, e As System.EventArgs) Handles btnParallelTwo.Click
- Call InitializeListView(ListView3)
- '// สร้าง ListViewItem เพื่อเก็บข้อมูล
- Dim items As New List(Of ListViewItem)
- Dim MaxValue As Integer = 100
- Dim Count As Integer = 0
- sWatch.Reset()
- sWatch.Start()
- Cursor = Cursors.WaitCursor
- '// Parallel Programming .NET
- '// สร้างตัวแปร results: เป็น List แบบ Tuple สำหรับเก็บผลลัพธ์ของชุดสามเหลี่ยมพีทาโกรัส
- Dim results As New List(Of Tuple(Of Integer, Integer, Integer))
- '// สร้างตัวแปร lock: ใช้สำหรับการป้องกันการเข้าถึงพร้อมกัน (Synchronization) ของหลายเธรด
- Dim lock As New Object()
- '// Parallel.For: ใช้เพื่อดำเนินการวนลูปแบบขนาน โดยในแต่ละรอบของลูปจะทำงานในเธรดต่างๆ
- Parallel.For(1, MaxValue, Sub(a)
- For b As Integer = 1 To MaxValue
- For c As Integer = 1 To MaxValue
- If a * a + b * b = c * c Then
- SyncLock lock
- results.Add(Tuple.Create(a, b, c))
- Count += 1 '// นับจำนวนคำตอบ
- End SyncLock
- End If
- Next
- Next
- End Sub)
- Cursor = Cursors.Default
- sWatch.Stop()
- mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
- lblTimerParallelTwo.Text = "เวลา Pararllel II : " & mTimeDouble.ToString & " sec."
- '// จัดเรียงข้อมูลตามคอลัมน์แรก
- 'results.Sort(Function(x, y) x.Item1.CompareTo(y.Item1))
- '// จัดเรียงข้อมูลตาม 2 หลักแรก
- 'results.Sort(Function(x, y)
- 'Dim comp1 = x.Item1.CompareTo(y.Item1)
- 'If comp1 <> 0 Then Return comp1
- 'Return x.Item2.CompareTo(y.Item2)
- ' End Function)
- '// จัดเรียงข้อมูลตาม 3 หลักแรก
- results.Sort(Function(x, y)
- Dim comp1 = x.Item1.CompareTo(y.Item1)
- If comp1 <> 0 Then Return comp1
- Dim comp2 = x.Item2.CompareTo(y.Item2)
- If comp2 <> 0 Then Return comp2
- Return x.Item3.CompareTo(y.Item3)
- End Function)
- '// แสดงผลลัพธ์
- For Each triplet In results
- '// สำหรับ ListView Control
- Dim NewItem As New ListViewItem(triplet.Item1) '// กำหนดค่าให้กับคอลัมน์แรก
- NewItem.SubItems.Add(triplet.Item2) ' เพิ่มค่าในคอลัมน์ที่สอง
- NewItem.SubItems.Add(triplet.Item3) ' เพิ่มค่าในคอลัมน์ที่สาม
- items.Add(NewItem)
- Next
- '// แสดงผลลัพธ์ใน ListView Control
- ListView3.Items.AddRange(items.ToArray())
- lblCountParallelTwo.Text = "จำนวน : " & Format(Count, "#,##")
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / Initialized ListView Control.
- ' / -------------------------------------------------------------------------------------------------
- Private Sub InitializeListView(LV As ListView)
- With LV
- .Columns.Clear() '// make sure columns collection is empty.
- .Items.Clear()
- .View = View.Details
- .GridLines = True
- .FullRowSelect = True
- .HideSelection = False
- .MultiSelect = True 'False
- '// Add 3 columns
- .Columns.Add("A")
- .Columns.Add("B")
- .Columns.Add("C")
- End With
- With LV
- .Columns(0).Width = ListView1.Width \ 3 - 10
- .Columns(1).Width = ListView1.Width \ 3 - 10
- .Columns(2).Width = ListView1.Width \ 3 - 5
- End With
- End Sub
- Private Sub frmPythagorasParallel_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- Application.Exit()
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|