ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 2921|ตอบกลับ: 0

[VB.NET] การหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก (Pythagoras) ด้วย Parallel Programming

[คัดลอกลิงก์]

315

กระทู้

506

โพสต์

6272

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6272







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


มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Imports System.Threading
  2. Imports System.Threading.Tasks

  3. Public Class frmPythagorasParallel
  4.     '/ Start-Stop Timer
  5.     Private mTimeDouble As Double
  6.     Private sWatch As New Stopwatch()

  7.     Private Sub frmThreadNestedLoop_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  8.         '// วนลูปผ่านคอนโทรลทั้งหมดบนฟอร์ม
  9.         For Each ctrl As Control In Me.Controls
  10.             '// ตรวจสอบว่าคอนโทรลเป็น Label หรือไม่
  11.             If TypeOf ctrl Is Label Then
  12.                 '// ตั้งค่าข้อความของ Label เป็นค่าว่าง
  13.                 CType(ctrl, Label).Text = String.Empty
  14.             End If
  15.         Next
  16.     End Sub

  17.     ' / -------------------------------------------------------------------------------------------------
  18.     ' / การใช้ LINQ ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
  19.     ' / Pythagorean Triplets ที่เป็นเลขจำนวนเต็มทั้งหมดที่จะเป็นไปได้ดังนี้
  20.     ' / -------------------------------------------------------------------------------------------------
  21.     Private Sub btnLinq_Click(sender As System.Object, e As System.EventArgs) Handles btnLinq.Click
  22.         Call InitializeListView(ListView1)
  23.         '// สร้าง ListViewItem เพื่อเก็บข้อมูล
  24.         Dim items As New List(Of ListViewItem)
  25.         Dim MaxValue As Integer = 100
  26.         sWatch.Reset()
  27.         sWatch.Start()
  28.         Cursor = Cursors.WaitCursor
  29.         ' / -------------------------------------------------------------------------------------------------
  30.         ' / LINQ ให้เริ่มนับ b = 1
  31.         Dim PythagoreanTriple =
  32.             From a In Enumerable.Range(1, MaxValue)
  33.             From b In Enumerable.Range(1, MaxValue)
  34.             Let c = Math.Sqrt(a * a + b * b)
  35.             Where (c = Math.Floor(c) AndAlso c <= MaxValue)
  36.             Select New With {a, b, c}
  37.         ' / -------------------------------------------------------------------------------------------------
  38.         For Each triplet In PythagoreanTriple
  39.             '// สำหรับ ListView Control
  40.             Dim NewItem As New ListViewItem(triplet.a) '// กำหนดค่าให้กับคอลัมน์แรก
  41.             NewItem.SubItems.Add(triplet.b) ' เพิ่มค่าในคอลัมน์ที่สอง
  42.             NewItem.SubItems.Add(triplet.c) ' เพิ่มค่าในคอลัมน์ที่สาม
  43.             items.Add(NewItem)
  44.         Next
  45.         '// แสดงผลลัพธ์ใน ListView Control
  46.         ListView1.Items.AddRange(items.ToArray())
  47.         Cursor = Cursors.Default
  48.         sWatch.Stop()
  49.         mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
  50.         lblTimerLinq.Text = "เวลา LINQ : " & mTimeDouble.ToString & " sec."
  51.         lblCountLinq.Text = "จำนวน : " & Format(ListView1.Items.Count, "#,##")
  52.     End Sub

  53.     ' / -------------------------------------------------------------------------------------------------
  54.     ' / การใช้ Parallel.For ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
  55.     ' / -------------------------------------------------------------------------------------------------
  56.     Private Sub btnParallelOne_Click(sender As System.Object, e As System.EventArgs) Handles btnParallelOne.Click
  57.         Call InitializeListView(ListView2)
  58.         '// สร้าง ListViewItem เพื่อเก็บข้อมูล
  59.         Dim items As New List(Of ListViewItem)
  60.         Dim MaxValue As Integer = 101
  61.         Dim Count As Integer = 0
  62.         sWatch.Reset()
  63.         sWatch.Start()
  64.         Cursor = Cursors.WaitCursor
  65.         '// Parallel Programming .NET
  66.         '// สร้างตัวแปร results: เป็น List แบบ Tuple สำหรับเก็บผลลัพธ์ของชุดสามเหลี่ยมพีทาโกรัส
  67.         Dim results As New List(Of Tuple(Of Integer, Integer, Integer))
  68.         '// สร้างตัวแปร lock: ใช้สำหรับการป้องกันการเข้าถึงพร้อมกัน (Synchronization) ของหลายเธรด
  69.         Dim lock As New Object()
  70.         '// Parallel.For: ใช้เพื่อดำเนินการวนลูปแบบขนาน โดยในแต่ละรอบของลูปจะทำงานในเธรดต่างๆ
  71.         Parallel.For(1, MaxValue, Sub(a)
  72.                                       Parallel.For(1, MaxValue, Sub(b)
  73.                                                                     Parallel.For(1, MaxValue, Sub(c)
  74.                                                                                                   If a * a + b * b = c * c Then
  75.                                                                                                       SyncLock lock '// ป้องกันการเข้าถึงพร้อมกัน
  76.                                                                                                           '// สร้าง List ของทูเพิล (Tuple)
  77.                                                                                                           results.Add(Tuple.Create(a, b, c))
  78.                                                                                                           Count += 1
  79.                                                                                                       End SyncLock
  80.                                                                                                   End If
  81.                                                                                               End Sub)
  82.                                                                 End Sub)
  83.                                   End Sub)
  84.         Cursor = Cursors.Default
  85.         sWatch.Stop()
  86.         mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
  87.         lblTimerParallelOne.Text = "เวลา Pararllel I : " & mTimeDouble.ToString & " sec."
  88.         '// ใช้ Lambda expression เพื่อสร้างฟังก์ชันเปรียบเทียบในตัว
  89.         '// Function(x, y): นี่คือฟังก์ชันเปรียบเทียบที่กำหนดเองในรูปแบบของ Lambda expression
  90.         '// ซึ่งใช้เพื่อเปรียบเทียบองค์ประกอบสองตัวในรายการที่กำลังจัดเรียง ฟังก์ชันนี้มีสองพารามิเตอร์ x และ y ซึ่งแทนทูเพิลสองตัวที่กำลังเปรียบเทียบ
  91.         '// x.Item1.CompareTo(y.Item1): เมธอด CompareTo ใช้เพื่อเปรียบเทียบค่าในฟิลด์ Item1 ของทูเพิล x กับค่าในฟิลด์ Item1 ของทูเพิล y
  92.         '// ถ้าค่า Item1 ของ x น้อยกว่าค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็นค่าลบ
  93.         '// ถ้าค่า Item1 ของ x เท่ากับค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็น 0
  94.         '// ถ้าค่า Item1 ของ x มากกว่าค่า Item1 ของ y เมธอด CompareTo จะคืนค่าเป็นค่าบวก
  95.         '// โค้ดในการจัดเรียงข้อมูลตามคอลัมน์แรก
  96.         results.Sort(Function(x, y) x.Item1.CompareTo(y.Item1))

  97.         '// จัดเรียงข้อมูลตาม 2 หลักแรก
  98.         'results.Sort(Function(x, y)
  99.         'Dim comp1 = x.Item1.CompareTo(y.Item1)
  100.         'If comp1 <> 0 Then Return comp1

  101.         'Return x.Item2.CompareTo(y.Item2)
  102.         '             End Function)

  103.         '// จัดเรียงข้อมูลตาม 3 หลักแรก
  104.         'results.Sort(Function(x, y)
  105.         'Dim comp1 = x.Item1.CompareTo(y.Item1)
  106.         'If comp1 <> 0 Then Return comp1

  107.         'Dim comp2 = x.Item2.CompareTo(y.Item2)
  108.         'If comp2 <> 0 Then Return comp2

  109.         'Return x.Item3.CompareTo(y.Item3)
  110.         '              End Function)

  111.         For Each triplet In results
  112.             '// สำหรับ ListView Control
  113.             Dim NewItem As New ListViewItem(triplet.Item1) '// กำหนดค่าให้กับคอลัมน์แรก
  114.             NewItem.SubItems.Add(triplet.Item2) ' เพิ่มค่าในคอลัมน์ที่สอง
  115.             NewItem.SubItems.Add(triplet.Item3) ' เพิ่มค่าในคอลัมน์ที่สาม
  116.             items.Add(NewItem)
  117.         Next
  118.         '// แสดงผลลัพธ์ใน ListView Control
  119.         ListView2.Items.AddRange(items.ToArray())
  120.         lblCountParallelOne.Text = "จำนวน : " & Format(Count, "#,##")
  121.     End Sub

  122.     ' / -------------------------------------------------------------------------------------------------
  123.     ' / การใช้ Parallel.For ใน VB.NET เพื่อหาชุดของความยาวด้านของสามเหลี่ยมมุมฉาก
  124.     ' / -------------------------------------------------------------------------------------------------
  125.     Private Sub btnParallelTwo_Click(sender As System.Object, e As System.EventArgs) Handles btnParallelTwo.Click
  126.         Call InitializeListView(ListView3)
  127.         '// สร้าง ListViewItem เพื่อเก็บข้อมูล
  128.         Dim items As New List(Of ListViewItem)
  129.         Dim MaxValue As Integer = 100
  130.         Dim Count As Integer = 0
  131.         sWatch.Reset()
  132.         sWatch.Start()
  133.         Cursor = Cursors.WaitCursor

  134.         '// Parallel Programming .NET
  135.         '// สร้างตัวแปร results: เป็น List แบบ Tuple สำหรับเก็บผลลัพธ์ของชุดสามเหลี่ยมพีทาโกรัส
  136.         Dim results As New List(Of Tuple(Of Integer, Integer, Integer))
  137.         '// สร้างตัวแปร lock: ใช้สำหรับการป้องกันการเข้าถึงพร้อมกัน (Synchronization) ของหลายเธรด
  138.         Dim lock As New Object()
  139.         '// Parallel.For: ใช้เพื่อดำเนินการวนลูปแบบขนาน โดยในแต่ละรอบของลูปจะทำงานในเธรดต่างๆ
  140.         Parallel.For(1, MaxValue, Sub(a)
  141.                                       For b As Integer = 1 To MaxValue
  142.                                           For c As Integer = 1 To MaxValue
  143.                                               If a * a + b * b = c * c Then
  144.                                                   SyncLock lock
  145.                                                       results.Add(Tuple.Create(a, b, c))
  146.                                                       Count += 1 '// นับจำนวนคำตอบ
  147.                                                   End SyncLock
  148.                                               End If
  149.                                           Next
  150.                                       Next
  151.                                   End Sub)

  152.         Cursor = Cursors.Default
  153.         sWatch.Stop()
  154.         mTimeDouble = sWatch.ElapsedMilliseconds * 0.001
  155.         lblTimerParallelTwo.Text = "เวลา Pararllel II : " & mTimeDouble.ToString & " sec."
  156.         '// จัดเรียงข้อมูลตามคอลัมน์แรก
  157.         'results.Sort(Function(x, y) x.Item1.CompareTo(y.Item1))
  158.         '// จัดเรียงข้อมูลตาม 2 หลักแรก
  159.         'results.Sort(Function(x, y)
  160.         'Dim comp1 = x.Item1.CompareTo(y.Item1)
  161.         'If comp1 <> 0 Then Return comp1

  162.         'Return x.Item2.CompareTo(y.Item2)
  163.         '             End Function)

  164.         '// จัดเรียงข้อมูลตาม 3 หลักแรก
  165.         results.Sort(Function(x, y)
  166.                          Dim comp1 = x.Item1.CompareTo(y.Item1)
  167.                          If comp1 <> 0 Then Return comp1

  168.                          Dim comp2 = x.Item2.CompareTo(y.Item2)
  169.                          If comp2 <> 0 Then Return comp2

  170.                          Return x.Item3.CompareTo(y.Item3)
  171.                      End Function)
  172.         '// แสดงผลลัพธ์
  173.         For Each triplet In results
  174.             '// สำหรับ ListView Control
  175.             Dim NewItem As New ListViewItem(triplet.Item1) '// กำหนดค่าให้กับคอลัมน์แรก
  176.             NewItem.SubItems.Add(triplet.Item2) ' เพิ่มค่าในคอลัมน์ที่สอง
  177.             NewItem.SubItems.Add(triplet.Item3) ' เพิ่มค่าในคอลัมน์ที่สาม
  178.             items.Add(NewItem)
  179.         Next
  180.         '// แสดงผลลัพธ์ใน ListView Control
  181.         ListView3.Items.AddRange(items.ToArray())
  182.         lblCountParallelTwo.Text = "จำนวน : " & Format(Count, "#,##")
  183.     End Sub

  184.     ' / -------------------------------------------------------------------------------------------------
  185.     ' / Initialized ListView Control.
  186.     ' / -------------------------------------------------------------------------------------------------
  187.     Private Sub InitializeListView(LV As ListView)
  188.         With LV
  189.             .Columns.Clear() '// make sure columns collection is empty.
  190.             .Items.Clear()
  191.             .View = View.Details
  192.             .GridLines = True
  193.             .FullRowSelect = True
  194.             .HideSelection = False
  195.             .MultiSelect = True 'False
  196.             '// Add 3 columns
  197.             .Columns.Add("A")
  198.             .Columns.Add("B")
  199.             .Columns.Add("C")
  200.         End With
  201.         With LV
  202.             .Columns(0).Width = ListView1.Width \ 3 - 10
  203.             .Columns(1).Width = ListView1.Width \ 3 - 10
  204.             .Columns(2).Width = ListView1.Width \ 3 - 5
  205.         End With
  206.     End Sub

  207.     Private Sub frmPythagorasParallel_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  208.         Me.Dispose()
  209.         GC.SuppressFinalize(Me)
  210.         Application.Exit()
  211.     End Sub

  212. End Class
คัดลอกไปที่คลิปบอร์ด


ดาวน์โหลดโค้ดต้นฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-7-20 13:36 , Processed in 0.272899 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้