16,556
社区成员
发帖
与我相关
我的任务
分享
Imports System.Threading
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim sw = Stopwatch.StartNew()
'NormalFill()
Dim dArr As String(,) = AdvancedFill()
'Dim dArr As String(,) = NormalFill()
'Dim dArr As String(,) = AdvancedFill2() '开销过大
'Dim dArr As String(,) = Fill3()
For i = 0 To 100
RichTextBox1.AppendText(dArr(i, 0) & "--" & dArr(i, 1) & vbCrLf)
Next
RichTextBox1.AppendText("主线程运行时间:" + sw.Elapsed.ToString)
End Sub
Private Function NormalFill() As String(,)
'填充一个二维数组,10000*2
Dim arr(100000, 1) As String
Dim rnd As New Random
Dim ri As Date = #1/1/1991#
For i = 0 To 100000
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(GetIntArray(rnd, 1000)).ToString
Next
Return arr
End Function
Private Function AdvancedFill() As String(,)
Dim arr(100000, 1) As String
Dim rnd As New Random
Dim ri As Date = #1/1/1991#
Parallel.For(0, 100000, Sub(i)
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(GetIntArray(rnd, 1000)).ToString
End Sub)
Return arr
End Function
Private Function AdvancedFill2() As String(,)
Dim arr(100000, 1) As String
Dim rnd As New Random
Dim ri As Date = #1/1/1991#
Parallel.For(0, 100000, Sub(i)
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(AdvancedGetIntArray(rnd, 1000)).ToString
End Sub)
Return arr
End Function
Private Function Fill3() As String(,)
Dim arr(100000, 1) As String
Dim rnd As New Random
Dim ri As Date = #1/1/1991#
Dim tk1 = Task.Factory.StartNew(Sub()
For i = 0 To 20000
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(AdvancedGetIntArray(rnd, 1000)).ToString
Next
End Sub)
Dim tk2 = Task.Factory.StartNew(Sub()
For i = 20001 To 60000
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(AdvancedGetIntArray(rnd, 1000)).ToString
Next
End Sub)
Dim tk3 = Task.Factory.StartNew(Sub()
For i = 60001 To 100000
arr(i, 0) = DateAdd(DateInterval.DayOfYear, i, ri).ToShortDateString
arr(i, 1) = GetVariance(AdvancedGetIntArray(rnd, 1000)).ToString
Next
End Sub)
Task.WaitAll()
Return arr
End Function
'产生一个两位数以内的正整数数组
Private Function GetIntArray(rnd As Random, len As Integer) As Integer()
Dim result(len - 1) As Integer
For i = 0 To len - 1
result(i) = rnd.Next(1, 100)
Next
Return result
End Function
Private Function AdvancedGetIntArray(rnd As Random, len As Integer) As Integer()
Dim result(len - 1) As Integer
Parallel.For(0, len - 1, Sub(i)
result(i) = rnd.Next(1, 100)
End Sub)
Return result
End Function
Private Function GetVariance(intArr() As Integer) As Double
Dim mean As Double
Dim all As Integer = 0
For i = 0 To intArr.Length - 1
all += intArr(i)
Next
mean = all / intArr.Length
Dim variance As Double = 0
For i = 0 To intArr.Length - 1
variance += (intArr(i) - mean) ^ 2
Next
Return variance
End Function
End Class