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?