繁体   English   中英

VBA:为什么 For Each 循环比 For 循环更快?

[英]VBA: Why are For Each loops faster than For loops?

在 VBA 中,众所周知, For Each循环将比For循环更快地遍历Collection ,两种循环方法之间的时间差作为Collection大小的函数呈指数增长(?)。 (当然,这假定迭代是“按顺序”在Collection成员上进行的。)

为什么它更快? For Each循环如何比通过Collection中的索引更快地访问项目?

我最近遇到了一些类的实例集合的相同问题,实际上, for eachfor快得多。 我运行了一些测试来了解原因,我发现使用for的额外延迟是由于在集合中的所有元素中找到指定的项目。

测试:我创建了一个简单的类,只包含一个整数作为公共字段,仅此而已。 然后,创建了该类的 100,000 个实例并添加到一个集合中

Dim mClass As cls
Dim col As New Collection   

For i = 1 To 100000
    Set mClass = New cls
    mClass.a = 1
    Call col.Add(mClass)
    Set mClass = Nothing
Next i

然后我测量了运行以下每个代码块的时间

1)对于每个(时间~0.95s)

For Each obj In col
    obj.a = 1
Next

2a) 通过集合的所有元素(时间 ~95s)

For i = 1 To 100000
    Set mClass = col(i)
    mClass.a = 1
    Set mClass= Nothing
Next i

2b) 仅对于第一个元素(时间 ~0.15s)

For i = 1 To 100000
    Set mClass = col(1)
    mClass.a = 1
    Set mClass = Nothing
Next i

2c) 仅针对最后一个元素(时间 ~180s)

For i = 1 To 100000
    Set mClass = col(100000)
    mClass.a = 1
    Set mClass = Nothing
Next i

3)分配和释放内存(时间~0.72s)

For i = 1 To 100000
    Set mClass = New cls
        mClass.a = 1
    Set mClass = Nothing
Next i

4)使用收集外的另一个实例(时间~0.05s)

Dim mclass2 As cls
Set mclass2 = New cls
For i = 1 To 100000
    Set mClass = mclass2
    mClass.a = 1
    Set mClass = Nothing
Next i

它所花费的时间在相对基础上比绝对基础上更有效,并且让我们了解时间花在了哪里。

您认为For EachFor 1 To快的假设是错误的。 两者都循环遍历一组他们可以以相同速度完成的数字。

For Each变体中,数字标识集合中的对象,例如 Sheets(1)、Sheets(2)、Sheets(3) 等。这些工作表不会在循环中加载甚至访问。 它们只是被引用。

相比之下, For i = 1 to 3: Set Ws = Sheets(i)只会创建对工作表的引用。

因此,不同之处在于您对引用对象的处理方式,而不是您引用它们的方式。 For Each经常显示为更简单的代码。 但是,如果您希望引用ActiveSheet.Cells(3)您确实需要知道这将是 C1 还是 A3,并且明显更容易编码是以牺牲透明度为代价的。 我把它当作一个品味问题。

Dim Arr As Variant
Dim R As Long
Arr = Range("A1:A20")
For R = 1 To UBound(Arr)
    Debug.Print Arr(R, 1)
Next R

Dim Rng As Range
Dim Cell As Range
Set Rng = Range("A1:A20")
For Each Cell in Rng
    Debug.Print Cell.Value
Next Cell

但这是因为第二个代码相对于第一个代码段的一次引用了工作表 20 次。 也许这就是您一直在阅读的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM