.net并行编程

小猪打滚 2017-04-06 09:50:16
随机产生任意个整数数组,并计算他们的方差,并把这些方差值和对应日期值转为字符串加入到一个二维数组当中。采用并行的方式进行添加,结果发现方差值有一大部分为0。请问各位高手,这是什么原因。并行方式为AdvancedFill()
代码如下:

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
...全文
199 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
仅就 Random 来说,你可以使用统一的 Random,例如定义为
Public Shared rnd As new Random 
这样可以保证这个值使用时全局随机。
Poopaye 2017-04-07
  • 打赏
  • 举报
回复
引用 2 楼 crxcg 的回复:
每个过程都创建Random,开销太大,而且不能完全发挥Random的功用。
不就1000个random么,有什么开销啊
小猪打滚 2017-04-07
  • 打赏
  • 举报
回复
每个过程都创建Random,开销太大,而且不能完全发挥Random的功用。
Poopaye 2017-04-06
  • 打赏
  • 举报
回复
能想到的解释就是数组里所有数都是一样的 给每个过程创建一个Random试试

16,556

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧