【问题标题】:Array search/compare is slow, compare to Excel VBA数组搜索/比较很慢,与 Excel VBA 相比
【发布时间】: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。谢谢你的斯托克

标签: arrays vb.net


【解决方案1】:

Stokke 建议创建数组 as String 而不是 Objekt Type。

Dim IFS_BV_Assy(,) as String

我使用Option Explicit Off 创建模块,因为在这一点上我从未发现 VBA 有任何区别。现在我用Dim .. as ... 声明任何变量。 现在,它和 VBA 一样快 =)

学习 = 犯错.. =)

【讨论】:

    【解决方案2】:

    在 VBA 中运行时,数据可能是最好的情况(大约 4000)。 30 秒似乎是 4000x4000=16.000.000 次迭代的合理时间。对于这个迭代次数来说,1 秒太短了。

    【讨论】:

    • 是的,我知道行数很大。但这两个程序中的代码相同......所以,事实上; VBA 就是这么快。
    • VBA 使用与 VB 相同的代码库。 VBA 可以比 VB 更慢或等于 VB,但不能更快。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2020-09-02
    • 2011-03-31
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多