vložil Radek Červinka
8. listopadu 2010 09:48
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
1uses
2 Generics.Collections;
3
4
5 procedure TForm2.btnHashList2Click(Sender: TObject);
6 var
7 i:Integer;
8 list: TDictionary<string, string>;
9
10 procedure mSave;
11 var
12 p: TPair<string, string>;
13 t: TextFile;
14 begin
15 assignfile(t, Edit3.Text+'testhash.dat');
16 rewrite(t);
17 for p in list do
18 writeln(t, p.Key + '='+p.Value);
19 closefile(t);
20 end;
21 procedure mLoad;
22 var
23 t: TextFile;
24 s, s1: string;
25 i:Integer;
26 begin
27 assignfile(t, Edit3.Text+'testhash.dat');
28 reset(t);
29 while not Eof(t) do
30 begin
31 readln(t, s);
32 i := Pos('=', s);
33 s1 := Copy(s, 1, i - 1);
34 list.Add(Copy(s, 1, i - 1), Copy(s, i+1, Length(s)));
35 end;
36 closefile(t);
37 end;
38
39 begin
40 ZacitCas(z, k);
41
42 list:=TDictionary<string, string>.Create;
43
44 ZacitCas(z1, k1);
45 for i := 0 to StrToIntDef(Edit1.Text,1000) - 1 do
46 begin
47 list.AddOrSetValue(IntToStr(i)+'S', 'asdfghjklp');
48 list.AddOrSetValue(IntToStr(i)+'I', IntToStr(9999));
49 end;
50 KonecCas(z1, k1);
51 mSave;
52
53 list.Free;
54
55 list:=TDictionary<string, string>.Create;
56 mLoad;
57
58 ZacitCas(z1, k1, False);
59 for i := 0 to StrToIntDef(Edit2.Text,200) - 1 do
60 list.AddOrSetValue('700S', 'zmena');
61 KonecCas(z1, k1);
62 mSave;
63
64 list.Free;
65
66 KonecCas(z, k);
67
68 Memo1.Lines.Add('HashedStringList: '+CelkovyCas(k)+' : '+CelkovyCas(k1));
69 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+.
a20908ab-79e1-4d4e-af4a-e2b1c1b31037|1|5.0
Tagy:
Praxe