| 
 | 
 
  
 
 
  
 
 
โค้ดชุดนี้นำเสนอการใช้ 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
 
 
 
 
 |