无论如何要快速迭代UDT集合?

时间:2016-02-23 20:35:29

标签: vb6

我们说我有一个UDT集合。我把它填充如下:

public type udtEmp 
    Id as long 
    Name as string
end type

dim col as new Collection
dim empRec as udtEmp, empDummy as udtEmp

for n = 1 to 100000
    empRec = empDummy  ' reset record

    emp.Id = n
    emp.Name = "Name " & n

    col.add emp, cstr(emp.Id)
next

现在我想循环它。我使用Long数据类型作为.Item()

的索引
dim n as long 
For n = 1 To 100000
    emp = col.Item(n)
Next

上面的代码可行,但它确实很慢 - 需要10,000毫秒才能进行迭代。如果我通过密钥访问集合,它会快得多 - 78毫秒。

For n = 1 To 100000
    emp = col.Item(cstr(n))
Next

问题在于,当我迭代收集时,我没有钥匙。如果我有一个对象集合而不是UDT,我可以for each obj in col,但是使用UDT,它不会让我以这种方式迭代。

我的一个想法是有一个索引和键的二级集合指向主集合,但我尽量不要使代码复杂化,除非我绝对必须。

那么我的选择是什么?

2 个答案:

答案 0 :(得分:1)

代码的优雅或性能是您必须做出的严肃决定。选择应该基于结果的影响。 for each优雅但很慢,并且与对象和类一起使用。但如果速度是一个主,那么使用UDT和数组。

在你的情况下,我认为一系列UDT最适合你的情况。为了获得更快的速度,尝试使用SAFE_ARRAY访问数组(你可以谷歌搜索它),结果令人印象深刻。

答案 1 :(得分:1)

您可以使用用户类型的类集合。它将提供具有出色性能的for-each迭代功能。

实现这一目标的最简单方法是通过Class Builder Utility(https://msdn.microsoft.com/en-us/library/aa442930(v=vs.60).aspx)。您可能需要首先运行加载项管理器并加载类构建器实用程序。 (我认为在安装vb6 / vs6时有关于这些功能的安装选项?因此,如果您没有在加载项管理器中看到类构建器实用程序,则可能是由于此原因)。 / p>

要使用类构建器实用程序匹配您的udt示例,首先添加一个类(例如:Employee),它具有两个属性(例如:EmpId和EmpName,分别为long和字符串类型)。然后根据Employee类添加一个集合(例如:Employees)。将其保存到项目(将创建两个新的类模块)并关闭实用程序。

现在,您可以创建新的Employees集合,加载它,并通过索引,密钥或for-each迭代它。 (注意:不要使用纯数字作为密钥 - 通过纯数字的密钥请求项目,即使是字符串,也会被解释为索引请求,它会很慢而且你会可能无法获得所需的项目)

此外 - 一旦创建了新类,您就可以为它们添加自定义属性和方法,以处理您可能需要的各种花哨的东西。

Dim i As Long
Dim Emp As Employee
Dim colEmp As New Employees
Dim name As String

' Loading
For i = 1 To 100000
  colEmp.Add i, "name" & CStr(i), "key" & CStr(i)
Next i

' iterate with index
For i = 1 To 100000
  Set Emp = colEmp(i)
  name = Emp.EmpName
Next i

' iterate with key
For i = 1 To 100000
  Set Emp = colEmp("key" & i)
  name = Emp.EmpName
Next i

'iterate with for-each
For Each Emp In colEmp
  name = Emp.EmpName
Next Emp

计时

在我的系统上输入上述代码:
装载时间:1秒
索引时间:20秒
关键时间:0.29秒
每次:0.031秒