VB6 - przyspieszenie zmiany odwołania do obiektu

0

Mam obiekt pewnej klasy, który został utworzony w module i jest ogólnie dostepny.
Co jakiś czas jest używana funkcja, w której jest tworzony i wypełniany danymi obiekt kLista.
Następnie jest tam:

Set kBiezacaLista = kLista

kBiezacaLista jest inicjowana przy tworzeniu obiektu.
Pierwsze wypełnienie listy jest robione błyskawicznie, jednak jeśli ma ona dużo elementów, powyższy kod wykonuje się kilka sekund.
Czy jest możliwość, żeby to przyspieszyć?

0

tak użyj po prostu zListy.

0

Ogólnie kBiezacaLista i kListy są to obiekty zawierające tablicę obiektów innej klasy, która posiada różne pola.
Samo czyszczenie tej tablicy wcale nie trwa długo, ale użycie Set, kiedy w tablicy jest wiecej niż tysiąc elementów powoduje już pewne opóznienie, które zwiększa się wraz z ilością elementów.

0

Z VB miałem do czynienia bardzo dawno, ale podajesz za mało informacji, przede wszystkim nie są to listy jak sugerowałeś tylko tablice - nie wiem jak elementy nowej listy są dodawane do istniejącej, tablice mają to do siebie, że dodanie 1 elementu powoduje konieczność realokacji powiększonej tablicy i przepisanie pozostałych elementów. Być może elementy nowej tablicy są dodawane do starej pojedynczo? Nie ma nawet sensu wróżenia co może być nie tak bo powodów może być masa. Pokaż realny kod, w którym jest problem to może uda się coś zoptymalizować.

0

No więc mam w klasie ListaFaktur_Klasa

Private lonUbound As Long
Private kLista() As Faktura_Klasa
Private kBiezaca As Faktura_Klasa
Private lonIndeks As Long

Private Sub Class_Initialize()
    lonUbound = -1
    lonIndeks = -1
    ReDim kLista(0)
End Sub

Public Sub DopiszFakture(kFaktura As Faktura_Klasa)
    If Not kFaktura Is Nothing Then
        lonUbound = lonUbound + 1
        ReDim Preserve kLista(lonUbound)
        Set kLista(lonUbound) = kFaktura
    End If
End Sub

W klasie Faktury_Klasa, której obiekt jest tworzony w module przy starcie mam

Private Sub Class_Initialize()    
    Set kBiezacaLista = New ListaFaktur_Klasa    
End Sub

No i mam tam funkcję PobierzGrupe, gdzie kLista jest wypełniana przez wywoływanie DopiszFakture w pętli.
Nastepnie jest wywoływane:

Set kBiezacaLista = kLista

0

Teraz mając np. 1000 elementów i chcąc dodać 5 musisz 5 razy realokować te 1000 elementów tablicy tak jak przypuszczałem.
Podczas inicjalizacji ustaw sobie rozmiar tej tablicy na przewidywalną wielkość, gdy zacznie brakować pamięci w tablicy zwiększaj ją o znacznie więcej niż jeden tak aby uniknąć częstego przepisywania tablicy, wartość tą możesz sobie dobrać doświadczalnie, jeśli to obiekty to nie powinny zajmować dużo miejsca bo to tylko puste wskaźniki.
Nie wiem jak jest zrealizowane usuwanie, ale jeśli robisz to często to zastanów się nad zamienieniem tablicy na listę. Niestety w VB z kodem nie pomogę.

1

Funkcja którą napisałem w VBScript, ale może się przyda - powinno przyspieszyć realokację tablicy:

' Add string to an unsorted string list
Sub StrListAdd(AList, ACount, AText)
  ACount = ACount + 1
  If ACount > UBound(AList)+1 Then
    ReDim Preserve AList(ACount+10)
  End If
  AList(ACount-1) = AText
End Sub

' Uzycie
Dim Lines
ReDim Lines(10)
LineCount = 0

' W petli:
StrListAdd Lines, LineCount, sLineText

Nowy rozmiar jest tu o 10 większy niż stary, można też zrobić lepszy algorytm - np. procentowy (nowy rozmiar = 130% starego).

1 użytkowników online, w tym zalogowanych: 0, gości: 1