VBA очень медленный, когда словарь полон объектов - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть словарь со строковыми ключами и заполненный объектами. Эти объекты содержат словарь, а этот объект содержит три словаря. Это три слоя глубиной. Я использую Microsoft Scripting Runtime Dictionary Object.

Основной словарь строки / объекта -Object Содержит словарь (String, Object) --Древол объектов (строка, объект) --Древол объектов (строка, объект ) --Dictionary объектов (строка, объект)

Когда я закончу с заданием и код завершен, словарь будет установлен в ничто. Когда это происходит, Class_Terminate вызывается для каждого объекта в каждом из словарей. Это очень медленно, и у меня возникают проблемы с определением причины или обходного пути.

Я использую класс cTimer для измерения производительности.

Как мне повысить производительность завершения или пропустить прекратить операцию? Есть ли какая-то ошибка или работа с объектом словаря?

Кстати, это Excel 32bit.

Пример кода Воспроизведение медлительности Попробуйте изменить i на 1000 или 10000. :

Option Explicit

Sub TestFillAndDestroy()
    Dim c1 As Class1


    Dim myDict As Dictionary
    Set myDict = New Dictionary

    Dim i As Long
    For i = 1 To 100
        Set c1 = New Class1
        c1.Fill
        myDict.Add CStr(i), c1
    Next

    Set myDict = Nothing 'extremely slow!

End Sub

Класс 1

Option Explicit

Private mDictofClass2 As Dictionary


Private Sub Class_Initialize()
    Set mDictofClass2 = New Dictionary
    Fill
End Sub

Sub Fill()
    Dim c2 As Class2
    Set c2 = New Class2
    c2.Name = Format(mDictofClass2.Count, "0000000")
    Add c2
End Sub

Sub Add(aClass2 As Class2)
    mDictofClass2.Add aClass2.Name, aClass2
End Sub

Private Sub Class_Terminate()
    Set mDictofClass2 = Nothing
End Sub

Класс 2

Option Explicit

Private mDictOfClass3 As Dictionary
Private mName As String

Property Get Name() As String
    Name = mName
End Property

Property Let Name(inputName As String)
    mName = inputName
End Property

Private Sub Fill()
    Dim c3 As Class3
    Dim i As Long
    For i = 1 To 20
        Set c3 = New Class3
        c3.Name = Format(i, "00")
        Add c3
    Next
End Sub

Public Sub Add(aClass3 As Class3)
    mDictOfClass3.Add aClass3.Name, aClass3
End Sub

Private Sub Class_Initialize()
    Set mDictOfClass3 = New Dictionary
    Fill
End Sub

Класс 3

Option Explicit

Private mDictOfClass4 As Dictionary 'just a poco
Private mDictOfStrings As Dictionary
Private mDictOfDoubleArray As Dictionary
Private mName As String
Property Let Name(inputName As String)
    mName = inputName
End Property

Property Get Name() As String
    Name = mName
End Property

Private Sub Class_Initialize()
    Set mDictOfDoubleArray = New Dictionary
    Set mDictOfClass4 = New Dictionary
    Set mDictOfStrings = New Dictionary
    Fill
End Sub

Private Sub Fill()
    Dim i As Long
    Dim numbers(3) As Double
    numbers(0) = 0.00514
    numbers(1) = 654
    numbers(2) = 45.2587414
    Dim c4 As Class4
    Dim key As String
    For i = 1 To 150
        key = Format(CStr(i), "000")
        mDictOfDoubleArray.Add key, numbers
        mDictOfStrings.Add key & "v ggbbbnbb", "cvggpoiubvtgb  b vgflkjklj  nnnn"
        Set c4 = New Class4
        c4.Name = key
        mDictOfClass4.Add c4.Name, c4
    Next


End Sub

Класс 4

Option Explicit

Private d1 As Double
Private d2 As Double
Private d3 As Double
Private d4 As Double
Private d5 As Double
Private d6 As String
Private d7 As String
Private d8 As Double
Private d9 As Double
Private d10 As Double

Private t1 As String
Private t2 As String

Property Let Name(inputName As String)
    t1 = inputName
End Property

Property Get Name() As String
    Name = t1
End Property

Private Sub Class_Initialize()
    d1 = 1
    d2 = 2
    d3 = 5
    d4 = 15
    d5 = 1254
    d6 = 13654
    d7 = 1586
    d8 = 1985.55
    d9 = 985
    d10 = 6.14598
    t2 = "asdfdasgft34 scvg"
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...