【发布时间】:2015-10-05 11:11:26
【问题描述】:
我刚刚从 VBA (Excel) 切换到 VB (Visual Studio Express 2013)。 现在我已将部分代码从 VBA 复制到 VB。 现在我想知道为什么VB这么慢...... 我正在创建一个包含 4 列和大约 4000 行的数组 (IFS_BV_Assy)。 其中有一些相同的条目,因此我将每个条目相互比较并用空字符串覆盖重复项。 代码如下所示:
For i = 1 To counter
For y = 1 To counter
If IFS_BV_Assy(1, y) = IFS_BV_Assy(1, i) And i <> y Then
If IFS_BV_Assy(2, i) < IFS_BV_Assy(2, y) Then
IFS_BV_Assy(1, i) = ""
Else
IFS_BV_Assy(1, y) = ""
End If
Exit For
End If
Next
Next
Counter 是数组的长度。
在 VBA 中大约需要 1 秒。在 VB 中大约需要 30 秒。通过循环。有人知道为什么吗? (我在每个步骤之间创建了一些时间戳,以确保什么是慢的。那个循环是坏人)
数组看起来像这样:
- (1,1) = 12.3.015 / (2,1) = 02
- (1,2) = 12.3.016 / (2,2) = 01
- (1,3) = 12.3.016 / (2,3) = 02
- (1,4) = 12.3.017 / (2,4) = 01
- (1,5) = 12.3.018 / (2,5) = 01
提前致谢
安迪
编辑:我这样创建数组:
strStartPath_BV_Assy = "\\xxx\xx\xx\"
myFile = Dir(strStartPath_BV_Assy & "*.*")
counter = 1
ReDim IFS_BV_Assy(0 To 2, 0 To 0)
IFS_BV_Assy(0, 0) = "Pfad"
IFS_BV_Assy(1, 0) = "Zg."
IFS_BV_Assy(2, 0) = "Rev"
Do While myFile <> ""
If UCase(Right(myFile, 3)) = "DWG" Or UCase(Right(myFile, 3)) = "PDF" Then
ReDim Preserve IFS_BV_Assy(0 To 2, 0 To counter)
IFS_BV_Assy(0, counter) = strStartPath_BV_Assy + myFile
IFS_BV_Assy(1, counter) = Left(Mid(myFile, 12), InStr(1, Mid(myFile, 12), "-") - 1)
IFS_BV_Assy(2, counter) = Mid(myFile, Len(myFile) - 8, 2)
counter = counter + 1
End If
myFile = Dir()
Loop
【问题讨论】:
-
你是如何定义数组的?值是否装箱?msdn.microsoft.com/en-us/library/yz2be5wk.aspx
-
我编辑我的问题以添加用于创建数组的代码。感谢您的链接。这也适用于 VB 吗?
-
像什么?
Dim IFS_BV_Assy(,,,) as String或只是Dim IFS_BV_Assy(,,,)。如果项目是 Object 类型的,那么每个项目都会被拆箱以进行比较,这会给您带来很大的性能影响。 -
是的,它也适用于 VB .NET。
-
对不起,我不能把代码放在这里,所以我编辑了这个问题。你的权利,我创建了数组
as String。现在大约 3.9 - 4.5 秒。在比较 1 - 2 秒。对于 VBA。谢谢你的斯托克