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完成下载