首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代Scripting.Dictionary/Collection对象

迭代Scripting.Dictionary/Collection对象
EN

Stack Overflow用户
提问于 2012-06-20 14:44:18
回答 1查看 5.1K关注 0票数 2

在过去的几年里,我有一个项目被修改和修改,从一个代码模块到另一个代码模块是不标准化的。在某些情况下,我使用了一个Scripting.Dictionary对象,而在另一些情况下,我有一个Collection对象。对于其中的每一个,有时通过计数(即For i = 1 to Obj.Count)迭代,有时通过For...Each迭代。

我想将相同的逻辑应用到尽可能多的这些情况中,希望将来的更改更加无缝,但我不确定哪种方法是最好的。(我相信为一种或另一种方法建立了一些特定的情况,但我也非常肯定一些代码可以使用任何可用的方法。)

我试着创建一个测试子来帮助我确定这些方法中哪一个最有效,但是结果有点不一致。总的来说,在一个Item中循环每个Dictionary似乎更快,但在某些情况下,我的测试显示在Collection中遍历每个Item的循环更快。差异可能取决于系统中在任何给定时间发生的其他一切。

我想知道,假设循环中的其他方法都是相同的,那么是否有人对哪种方法始终是最快的有一个明确的答案。或者,在返回结果时,是否有什么方法可以使我的测试子更一致,这样我可以自己回答这个问题?

我想出的测试代码是:

代码语言:javascript
复制
Option Explicit

Sub Test_Dictionary_Iteration_Speed()

Dim Coll1 As New Collection, Coll2 As New Collection
Dim Dict1 As New Scripting.Dictionary, Dict2 As New Scripting.Dictionary, Dict3 As New Scripting.Dictionary
Dim i As Integer, j As Integer, l As Integer
Dim StartTime As Single, StopTime As Single
Dim v As Variant
Dim Obj As TestObject 'A custom Class that has only one member variable, MainVal, and no functions/subs

    For i = 0 To 32766
        Set Obj = New TestObject
        Obj.MainVal = i
        Dict1.Add CStr(i), Obj
        Dict2.Add CStr(i), Obj
        Dict3.Add CStr(i), Obj
        Coll1.Add Obj, CStr(i)
        Coll2.Add Obj, CStr(i)
    Next i

    StartTime = Timer()

    For j = 0 To Dict1.Count - 1
        l = CInt(Dict1(CStr(j)).MainVal)
        Set Obj = Dict1(CStr(l)) 'Do something useful within the loop
        Set Obj = Nothing
        Dict1.Remove CStr(l)
    Next j

    StopTime = Timer()

    Debug.Print "Dict1 for x to y: " & StopTime - StartTime

    StartTime = Timer()

    For Each v In Dict2.Items
        l = CInt(v.MainVal)
        Set Obj = Dict2(CStr(l))
        Set Obj = Nothing
        Dict2.Remove CStr(l)
    Next v

    StopTime = Timer()

    Debug.Print "Dict2 for each item: " & StopTime - StartTime

    StartTime = Timer()

    For Each v In Dict3.Keys
        l = CInt(Dict3(v).MainVal)
        Set Obj = Dict3(CStr(l))
        Set Obj = Nothing
        Dict3.Remove CStr(l)
    Next v

    StopTime = Timer()

    Debug.Print "Dict3 for each key: " & StopTime - StartTime

    '---------- Division between Dictionary and Collection

    StartTime = Timer()

    For j = 0 To Coll1.Count - 1
        l = CInt(Coll1(CStr(j)).MainVal)
        Set Obj = Coll1(CStr(l))
        Set Obj = Nothing
        Coll1.Remove CStr(l)
    Next j

    StopTime = Timer()

    Debug.Print "Coll1 for x to y: " & StopTime - StartTime

    StartTime = Timer()

    For Each v In Coll2
        l = CInt(v.MainVal)
        Set Obj = Coll2(CStr(l))
        Set Obj = Nothing
        Coll2.Remove CStr(l)
    Next v

    StopTime = Timer()

    Debug.Print "Coll2 for each item: " & StopTime - StartTime

    Debug.Print vbNewLine & "-----" & vbNewLine   


End Sub

实际的输出示例,表明“最佳”选项并不总是相同的:

X到y的

Dict1 : 0.2011719

每个项目的Dict2 : 0.1738281

每个键的Dict3 : 0.2167969

X到y的Coll1 : 0.2050781

每个项目的Coll2:0.1386719

X到y的Dict1 : 0.1875

每个项目的Dict2 : 0.171875

每个键的Dict3 : 0.234375

X到y的Coll1 : 0.2050781

每个项目的Coll2:0.1542969

X到y的Dict1 : 0.25

每个项目的Dict2 : 0.21875

每个键的Dict3 : 0.265625

X到y的Coll1 : 0.234375

每个项目的Coll2:0.171875

X到y的Dict1 : 0.265625

每个项目的Dict2:0.203125

每个键的Dict3 : 0.296875

X到y的Coll1 : 0.234375

每个项目的Coll2 : 0.21875

X到y的Dict1 : 0.265625

每个项目的Dict2 : 0.1875

每个键的Dict3 : 0.234375

X到y的Coll1 : 0.203125

每个项目的Coll2:0.15625

X到y的Dict1 : 0.28125

每个项目的Dict2:0.1875

每个键的Dict3 : 0.25

X到y的Coll1 : 0.234375

每个项目的Coll2:0.1875

X到y的Dict1 : 0.28125

每个项目的Dict2:0.21875

每个键的Dict3 : 0.328125

X到y的Coll1 : 0.234375

每个项目的Coll2 : 0.234375

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-20 15:57:02

除非您知道给定语句或过程的执行时间是一个问题,否则您不应该在优化上浪费人力时间。首先设计和调试,然后如果您认为事情太慢(可能不会),配置文件,然后优化(执行时间通常会浪费在与您想象的完全不同的地方)。

For Each结构很好,很简洁,很整洁。不使用它的唯一原因是如果您要从正在循环的集合中删除项。然后你冒着跳过某些物品的风险。如果您计划删除项目,请循环索引,然后向后执行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11122074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档