[Delphi] Tablice Asocjacyjne wolniejsze niż zwykłe

0

Witam. Od jakiegoś czasu bawię się tablicami asocjacyjnymi TAssocArray (na podstawie artykułu znalezionego na 4programmers). Podniecony tym że są szybkie i w ogóle, samemu nie sprawdziłem jak jest naprawdę. Ale dzisiaj postanowiłem to zrobić. Co się okazało? Są co najmniej 2 razy wolniejsze niż zwykłe tablice dynamiczne. Do testów posłużyły 2 procedury, jedna tworzy tablice dynamiczną, 2000 rekordów, do każdego dodaje do pola rekordu Nazwa, tekst 'Tekst '+IntToStr(i). Potem w pętli wyszukuje wartości środkowego rekordu, czyli 'Tekst 1000'. Druga procedura to tablica asocjacyjna, analogicznie: tworze 2000 rekordów, dodaje wskaźnik do tablicy asocjacyjnej z kluczem 'Tekst '+IntToStr(i). Potem szukam. Czas mierzyłem GpProfile i jakąś procedurą z WinAPI którą znalazłem w książce. Wyniki były zbliżone. Czas dynamicznej to 1,285511 sek. a asocjacyjnej 2,187760
Kod:
Dynamiczne:

procedure TForm1.Button1Click(Sender: TObject);
 var
   i: integer;
   Baza: Array of TBaza;
   stoper : TStoper;
 const
   ILOSC = 2000;
begin{>>GpProfile} ProfilerEnterProc(1); try {GpProfile>>}
   for i:=0 to ILOSC do
   begin
    SetLength(Baza, Length(Baza)+1);
    Baza[High(Baza)].Nazwa := 'Tekst '+inttostr(i);
   end;

   for i:=0 to ILOSC do
   begin
    if Baza[i].Nazwa='Tekst 1000' then Break;
   end;

{>>GpProfile} finally ProfilerExitProc(1); end; {GpProfile>>}end;

Asocjacyjne:

procedure TForm1.Button2Click(Sender: TObject);
 var
   i: integer;
   Baza: PBaza;
   stoper : TStoper;
 const
   ILOSC = 2000;
begin{>>GpProfile} ProfilerEnterProc(2); try {GpProfile>>}
   for i:=0 to ILOSC do
   begin
    New(Baza);
    Baza^.Nazwa := 'Tekst '+inttostr(i);
    Lista['Tekst '+inttostr(i)] := Baza;
   end;

   if Lista['Tekst 1000']<>nil then
     Form1.Caption := 'ok';

{>>GpProfile} finally ProfilerExitProc(2); end; {GpProfile>>}end;

Tak więc co jest takiego świetnego w tablicach asocjacyjnych oprócz wygodnego szukania?

0

Nic?

Może poza wygodą ze nie trzeba ręcznie alokować?

0

Myślałem że asocjacyjne to jakaś petarda będzie. A to nawet na pługa się nie nadaje. Może mam jakąś starą wersje? Poszukam coś na torrym.

0

Twój ten jest trochę nietrafny. W obydwóch funkcjach głównym obciążeniem jest wypełnianie danymi. Tablicę dynamiczną wypełniasz liniowo element po elemencie - nic dziwnego, że zajmuje to mało czasu. W tablicy asocjacyjnej dodanie elementu kosztuje dużo więcej (dla każdego dodawanego elementu jest oddzielnie obliczane jego położenie w mapie).

Co jest głównym problemem? Spójrz na funkcje z perspektywy:

  1. wstawiłeś 2000 elementów...
  2. po czym dokonałeś aż jednego wyszukiwania.

Po pierwsze: zrób podziel funkcje na dwie częśći: zapisującą dane - tutaj popisze się tablica dynamiczna. I na część odczytującą dane: to znaczy stwórz funkcję, która będzie miała pętlę dokonującą 2000 poszukiwań - tutaj popisze się asocjacyjna.

Po drugie: wypełnij tablice danymi losowymi. Szukaj również elementów losowych. W tej chwili test nie ma sensu statystycznego - w ten sposób nie zmierzysz miarodajnie wydajności.

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