Наиболее эффективный способ переразмерения массива - это ограничение количества раз, когда вы изменяете размер этого массива. Каждый раз, когда вы изменяете размер массива, VB берет весь массив и копирует его, тратя время и память.
Если вы не знаете размер вашего массива во время разработки, вам следует сделать правильный выбор максимального размера массива, а затем заполнить массив. После заполнения массива вы можете изменить его размер до нужного размера.
В циклах часто лучше сделать это предположение, удваивая размер текущего массива, когда у вас заканчивается свободное пространство. Это можно увидеть в приведенном ниже действии: RedimTestA()
изменяет размер массива каждую итерацию (1 000 000 раз), а RedimTestB()
изменяет его только изредка (22 раза).
На моем ноутбуке RedimTestA()
занимает 3,93 секунды, а RedimTestB()
- 0,41 секунды.
Option Explicit
Sub RedimTest()
Dim tA, tB As Single
tA = RedimTestA(1000000)
tB = RedimTestB(1000000)
MsgBox "Test A takes : " & tA & ", and Test B takes : " & tB
End Sub
Function RedimTestA(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
Do While i <= iterations
ReDim Preserve aryString(i) As String
aryString(i) = "ABCEFG123"
i = i + 1
Loop
RedimTestA = Timer - t
End Function
Function RedimTestB(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
ReDim aryString(0) As String
Do While i <= iterations
If i >= UBound(aryString) Then
ReDim Preserve aryString(i * 2) As String
End If
aryString(i) = "ABCEFG123"
i = i + 1
Loop
ReDim Preserve aryString(i - 1) As String ' i - 1 becuase of the final i = i + 1
RedimTestB = Timer - t
End Function