|
xdwy81129 发表于 2014-1-17 01:00
另:尝试了一下多线程(创建了两个),耗时约8秒(略有提速)
这位老兄深夜1点发贴,敬佩中。。。
是这样的,楼主的代码限速步骤其实是在匹配数组B的循环上(我分步测试下,其占时约为整个步骤的2/3),因此,多线程的操作就是把B数组进行拆分成两个数组,中间切,由此形成两个sub,每个sub一个线程,而字典的统计则为公共步骤。
昨天的测试有些匆忙,今天优化了下,多线程耗时约为2秒(不超过3秒),由此观之,若拆分的数组越多,即线程越多,则耗时会更少(再加上楼主高配的电脑。。。。。。{:101:})。以下是部分代码,有兴趣的朋友可以去测试下:
注:定义一个pubic的字典- '拆分的两个sub
- Sub Pp1()
- Dim B As Array, i As Long, iRow As Long, MidRow As Long
- iRow = Globals.Sheet2.Range("A" & Globals.Sheet2.Rows.Count).End(3).Row
- MidRow = Int(iRow / 2)
- B = Globals.Sheet2.Range("a1:a" & MidRow).Value
- For i = 1 To UBound(B)
- If d.ContainsKey(B(i, 1)) Then B(i, 1) = "有" Else B(i, 1) = "无"
- Next i
- Globals.Sheet2.Range("b1:b" & MidRow).Value = B
- End Sub
- Sub Pp2()
- Dim B As Array, i As Long, iRow As Long, MidRow As Long
- iRow = Globals.Sheet2.Range("A" & Globals.Sheet2.Rows.Count).End(3).Row
- MidRow = Int(iRow / 2)
- B = Globals.Sheet2.Range("a" & MidRow + 1 & ":a" & iRow).Value
- For i = 1 To UBound(B)
- If d.ContainsKey(B(i, 1)) Then B(i, 1) = "有" Else B(i, 1) = "无"
- Next i
- Globals.Sheet2.Range("b" & MidRow + 1 & ":b" & iRow).Value = B
- End Sub
- '以下是按键部分代码:
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim Start, Finish, TotalTime As Double
- Start = Microsoft.VisualBasic.DateAndTime.Timer
- Dim A As Array, i As Long
- Me.Application.ScreenUpdating = False
- A = Globals.Sheet1.Range("a1").CurrentRegion.Value
- For i = 1 To UBound(A)
- d(A(i, 1)) = ""
- Next i
- Dim t1 As Threading.Thread
- Dim t2 As Threading.Thread
- t1 = New Threading.Thread(AddressOf Me.Pp1)
- t2 = New Threading.Thread(AddressOf Me.Pp2)
- t1.Start()
- t2.Start()
- Finish = DateTime.Now.ToOADate()
- TotalTime = Microsoft.VisualBasic.DateAndTime.Timer - Start
- MsgBox("耗时: " & Format(TotalTime, "0.00") & " 秒!")
- Me.Application.ScreenUpdating = True
- End Sub
复制代码 |
评分
-
查看全部评分
|