Vb6 无论如何,要在UDT集合上快速迭代?

Vb6 无论如何,要在UDT集合上快速迭代?,vb6,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 "

假设我有一个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
现在我想循环一下。我使用长数据类型作为.Item()的索引

上面的代码可以工作,但速度非常慢——迭代需要10000毫秒。如果我通过一个键访问集合,它会快得多——78毫秒

For n = 1 To 100000
    emp = col.Item(cstr(n))
Next
问题是当我迭代集合时,我没有键。如果我有一个对象集合而不是UDT,我可以对col中的每个obj执行
,但是有了UDT,就不允许以这种方式进行迭代

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


那么我的选择是什么呢?

代码的优雅或性能是您必须做出的严肃决定。选择应基于结果的影响<代码>for each
优雅但缓慢,适合对象和类。但是如果速度是个问题,那么就使用UDT和数组


在您的情况下,我认为UDT数组最适合您的情况。为了获得更快的速度,请尝试使用
SAFE\u ARRAY
(您可以通过谷歌搜索)访问数组,结果令人印象深刻。

您可以使用用户类型的类集合。它将为每次迭代提供性能优异的功能

实现这一点的最简单方法是通过Class Builder实用程序()。您可能需要首先运行外接程序管理器并加载类生成器实用程序。(我认为在安装vb6/vs6时,存在与这些功能相关的安装选项?因此,如果在外接程序管理器中看不到Class Builder实用程序,则可能是由于此原因)

要匹配udt示例,请使用Class Builder实用程序,首先添加一个类(例如:Employee),该类具有两个属性(例如:EmpId和EmpName,分别为long和string类型)。然后根据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秒

…索引的二次收集
这是我过去常做的事情(通常是整数数组)。谢天谢地,对我们大多数人来说,那些日子已经过去了……问题是如何处理这些收藏品。设置colEmp=Nothing需要2-3秒。。。如果您处理的是复杂的对象,则更多。一组UDT或一组UDT根本不需要时间。将
Set colEmp=Nothing
添加到上述代码的末尾大约需要0.6秒。如果向集合中添加了更多元素或更复杂的项,则销毁集合所需的时间会更长。问题-迭代集合/数组/udt与创建/销毁它们的比率是多少?如果您经常创建新的数据集,并且只进行一点迭代,那么您的udt方法总体上会更好。另一方面,如果您经常遍历一个不常创建的数据集,那么上面的用户类总体上可能会更好。我接管了一个旧项目,该项目在各地复制了大量集合。它是为少数项目设计的,但现在它处理的是集合中的10万个项目,所以发布对象的速度非常慢。好吧,这太糟糕了。尽管set=nothing会/应该很快返回,但即使直接向.Net进行端口连接,也可能不会有什么帮助,因为您只是在延迟gc,然后在不确定的时间后会遇到问题。是时候重构了,不要复制所有这些集合了!(很高兴能在那里帮忙!)
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