V minulém článku o porovnání rychlosti JSON s jinými způsoby se diskuze trošku rozjela, tak přicházím i se svým řešením pro rychlou implementaci za pomoci TDictionary, které je velmi rychlé a umožňuje použití generik.
TDictionary neumožňuje ukládání a načítání, takže jsem si musel vypomoci sám, abych dodržel podmínky z minulého článku (procedury mLoad a mSave).
Časová náročnost je velmi malá (největší čas trvá mé ne moc optimalizované načítání a ukládání), samotná práce s položkami je velmi efektivní (2000 položek, 500 aktualizací).
třída: celkova doba : doba prace bez nahravani/ukladani
HashedStringList: 5969 : 5953
TDictionary: 16 : 0
MS XML: 29922 : 29781
TIniFile: 2469 : 2469
TMemIni: 5953 : 5937
StringList: 3016 : 3016
uses
Generics.Collections;
procedure TForm2.btnHashList2Click(Sender: TObject);
var
i:Integer;
list: TDictionary<string, string>;
procedure mSave;
var
p: TPair<string, string>;
t: TextFile;
begin
assignfile(t, Edit3.Text+'testhash.dat');
rewrite(t);
for p in list do
writeln(t, p.Key + '='+p.Value);
closefile(t);
end;
procedure mLoad;
var
t: TextFile;
s, s1: string;
i:Integer;
begin
assignfile(t, Edit3.Text+'testhash.dat');
reset(t);
while not Eof(t) do
begin
readln(t, s);
i := Pos('=', s);
s1 := Copy(s, 1, i - 1);
list.Add(Copy(s, 1, i - 1), Copy(s, i+1, Length(s)));
end;
closefile(t);
end;
begin
ZacitCas(z, k);
list:=TDictionary<string, string>.Create;
ZacitCas(z1, k1);
for i := 0 to StrToIntDef(Edit1.Text,1000) - 1 do
begin
list.AddOrSetValue(IntToStr(i)+'S', 'asdfghjklp');
list.AddOrSetValue(IntToStr(i)+'I', IntToStr(9999));
end;
KonecCas(z1, k1);
mSave;
list.Free;
list:=TDictionary<string, string>.Create;
mLoad;
ZacitCas(z1, k1, False);
for i := 0 to StrToIntDef(Edit2.Text,200) - 1 do
list.AddOrSetValue('700S', 'zmena');
KonecCas(z1, k1);
mSave;
list.Free;
KonecCas(z, k);
Memo1.Lines.Add('HashedStringList: '+CelkovyCas(k)+' : '+CelkovyCas(k1));
end;
Závěr: pokud potřebujete strukturovaný zápis dat, zvažte použití JSON, v ostatních případech zvažte TDictionary nebo i jiné třídy z Generics.Collections. Delphi 2009+.