VBA关于数组Dim,ReDim Preserve运行速度对比思考

VBA技术 专栏收录该内容
0 篇文章 0 订阅

VBA关于数组Dim,ReDim Preserve运行速度对比思考

以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常慢,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用
经测试得出一下结论:
1 、ReDim Preserve的速度快慢对redim的次数比较敏感。
循环100万次,10万次,1万次,对单元格赋值,dim数组,用字典的count次数定义数组维度,及ReDim Preserve动态定义数组,运行时间如下:
在这里插入图片描述
大家会发现动态数组运行起来每增加10倍次数,时间却增加100倍,
但是如果是for i = 1000000 to 1 step -1时,100W次也就2秒左右,
综上所述,直接定义一个较大维度的数组写代码比较简单,速度也能接受,但是10W次一次的循环直接ReDim Preserve也可以接受
先赋值给字典,然后用字典的count计数再定义字典,写起来稍微麻烦,但速度快。
测试代码如下:

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
Sub 测试用时()
Dim n&, i&, sr$, A$, B$, C$, Mypath$, brr()
Application.ScreenUpdating = False
Rem 单元格操作用时
iRow = 10000
Range("A1:D" & iRow).ClearContents
t = Timer
Mypath = "C:\Users\DDN\Desktop\test\*.*"
For i = 1 To iRow
    Cells(i, 1) = i
    Cells(i, 2) = i * 2
    Cells(i, 3) = i * 4
    Cells(i, 4) = i * 6
Next
[G1].Value = Format(Timer - t, "0.00")
i = 0


Rem 数组操作用时定义一个很大维度
Range("A1:D" & iRow).ClearContents
t = Timer
Dim arr(1 To 10000, 1 To 4)
For i = 1 To iRow
    arr(i, 1) = i '序号
    arr(i, 2) = i * 2
    arr(i, 3) = i * 4
    arr(i, 4) = i * 6
Next
Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
[G2].Value = Format(Timer - t, "0.00")
i = 0


Rem 用字典count重定义数组维度
Range("A1:D" & iRow).ClearContents
t = Timer
Set Mydic = CreateObject("Scripting.Dictionary") '创建一个字典放结果
For i = 1 To iRow
        A = i * 2
        B = i * 4
        C = i * 6
        Mydic(n) = A & "|" & B & "|" & C
Next
i = 0
ReDim myarr(1 To Mydic.Count, 1 To 4)
For i = 1 To Mydic.Count
    myarr(i, 1) = i
    myarr(i, 2) = Split(Mydic(n), "|")(0)
    myarr(i, 3) = Split(Mydic(n), "|")(1)
    myarr(i, 4) = Split(Mydic(n), "|")(2)
Next
Range("A1").Resize(UBound(myarr), UBound(myarr, 2)) = myarr
[G3].Value = Format(Timer - t, "0.00")
i = 0


Rem ReDim Preserve arr
Range("A1:D" & iRow).ClearContents
t = Timer
For i = 1 To iRow
        ReDim Preserve brr(1 To 4, 1 To i)
        brr(1, i) = i
        brr(2, i) = i * 2
        brr(3, i) = i * 4
        brr(4, i) = i * 6
Next
Range("A1").Resize(i, 4) = Application.Transpose(brr)
[G4].Value = Format(Timer - t, "0.00")
Application.ScreenUpdating = True
End Sub











VBA关于数组Dim,ReDim Preserve运行速度对比思考
如何插入一段漂亮的代码片
以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常慢,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用
经测试得出一下结论:
1 、ReDim Preserve的速度快慢对redim的次数比较敏感。
循环100万次,10万次,1万次,对单元格赋值,dim数组,用字典的count次数定义数组维度,及ReDim Preserve动态定义数组,运行时间如下:
在这里插入图片描述
大家会发现动态数组运行起来每增加10倍次数,时间却增加100倍,
但是如果是for i = 1000000 to 1 step -1时,100W次也就2秒左右,
综上所述,直接定义一个较大维度的数组写代码比较简单,速度也能接受,但是10W次一次的循环直接ReDim Preserve也可以接受
先赋值给字典,然后用字典的count计数再定义字典,写起来稍微麻烦,但速度快。
测试代码如下:

如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
Sub 测试用时()
Dim n&, i&, sr$, A$, B$, C$, Mypath$, brr()
Application.ScreenUpdating = False
Rem 单元格操作用时
iRow = 10000
Range("A1:D" & iRow).ClearContents
t = Timer
Mypath = "C:\Users\DDN\Desktop\test\*.*"
For i = 1 To iRow
    Cells(i, 1) = i
    Cells(i, 2) = i * 2
    Cells(i, 3) = i * 4
    Cells(i, 4) = i * 6
Next
[G1].Value = Format(Timer - t, "0.00")
i = 0


Rem 数组操作用时定义一个很大维度
Range("A1:D" & iRow).ClearContents
t = Timer
Dim arr(1 To 10000, 1 To 4)
For i = 1 To iRow
    arr(i, 1) = i '序号
    arr(i, 2) = i * 2
    arr(i, 3) = i * 4
    arr(i, 4) = i * 6
Next
Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
[G2].Value = Format(Timer - t, "0.00")
i = 0


Rem 用字典count重定义数组维度
Range("A1:D" & iRow).ClearContents
t = Timer
Set Mydic = CreateObject("Scripting.Dictionary") '创建一个字典放结果
For i = 1 To iRow
        A = i * 2
        B = i * 4
        C = i * 6
        Mydic(n) = A & "|" & B & "|" & C
Next
i = 0
ReDim myarr(1 To Mydic.Count, 1 To 4)
For i = 1 To Mydic.Count
    myarr(i, 1) = i
    myarr(i, 2) = Split(Mydic(n), "|")(0)
    myarr(i, 3) = Split(Mydic(n), "|")(1)
    myarr(i, 4) = Split(Mydic(n), "|")(2)
Next
Range("A1").Resize(UBound(myarr), UBound(myarr, 2)) = myarr
[G3].Value = Format(Timer - t, "0.00")
i = 0


Rem ReDim Preserve arr
Range("A1:D" & iRow).ClearContents
t = Timer
For i = 1 To iRow
        ReDim Preserve brr(1 To 4, 1 To i)
        brr(1, i) = i
        brr(2, i) = i * 2
        brr(3, i) = i * 4
        brr(4, i) = i * 6
Next
Range("A1").Resize(i, 4) = Application.Transpose(brr)
[G4].Value = Format(Timer - t, "0.00")
Application.ScreenUpdating = True
End Sub











Markdown 1794 字数 100 行数 当前行 13, 当前列 0 HTML 1685 字数 77 段落
×
拖拽到此处
图片将通过Fatkun完成下载
  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

我爱吃土豆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值