Autor Téma: = pro string  (Přečteno 130 krát)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 15
    • Verze Delphi: FPC :D
= pro string
« kdy: 15-05-2022, 21:39:15 »
Excellent
Rated 1 time
Zdarec,
dneska jen takovej tip, pokud porovnavate hodne retezce (treba v JsonDataObjects :) ).
JSO pouziva pri pridani/cteni polozky klasicky operator = a protoze je to pro nas stezejni, tak jsem se mu podival na zoubek. Funkce = je napsana pekne, akorat ze se blizi spise funkci Compare, tedy pokud jsou retezce tuzne dlouhe, stejne je porovnava dale, to napriklad. take je pouzito porovnani per byte, coz kdyz uz mame 64bitove procesory, tak je to trochu zbytecne.. Jeste nemam odladeno, ale prepsal jsem v JSO tento = na vlastni funkci, tedy upravenou ustrcosi. Jednak vraci boolean (porovnani equal fakt nema smysl resit cokoliv jineho), jednak porovnava delku (a rovnou zkonci), a jednak porovnava prvnich x znaku per 8byte (UInt64) a posleze dojede zbyle znaky. Jak rikam, nemam odladeno, ale...

Kód: Delphi [Vybrat]
  1.      
  2.    var js := JsonDataObjects.TJsonBaseObject.Parse('{}') as tJsonObject;
  3.  
  4.      var t1 := PreciseNowLocal; // getSystemTimeAsFileTime - vraci hundreds of ns (je v tom nejaka ta matika apod, tak to berte s rezervou)
  5.      for var I := 0 to 10000 do
  6.       js.S[i.ToString] := i.ToString;
  7.      var t2 := PreciseNowLocal;
  8.  
  9.      writeln(PreciseNowstr(t2-t1));
  10.  
  11.      var t3 := PreciseNowLocal;
  12.      for var i2 := 0 to 10000 do
  13.       var a := js.S[i2.ToString];
  14.      var t4 := PreciseNowLocal;
  15.  
  16.      writeln(PreciseNowstr(t4-t3));
  17.  

vraci pro originalni kod :
0000.00.00-00:00:00.0298_0998-0    // 298ms zapis
0000.00.00-00:00:00.0303_0999-0    // 303ms cteni

pro nas upraveny :
0000.00.00-00:00:00.0171_0500-0    // 171ms zapis
0000.00.00-00:00:00.0171_0999-0    // 171ms cteni

Jasne, jedna se o extrem, zatim neodladeny, zatim ... atd.. Nicmene, pokud casto porovnavate retezce, je tahle cesta mozna uspora..
Porad rikam, ze kod samotnych delphi je velmi casto neoptimalizovany, kdyz i ... jako ja ho dokaze zrychlit. O tom, ze misto equal se pouzije "compare", to uz nema smysl resit, neb pokud programator chce equal, mel by to byt optimalizovany equal.

Samozrejme, mozna neco delam blbe, neni to radne otestovano, ale rychlejsi to bude jiste, zvlast u delsich retezcu/keys. Mozna bych mohl jeste zkusit stupidnejsi test a sice primo test retezcu, ne zaobaleni v JSO, ale to mozna priste, resim svuj problem s rychlosti.

P.S.> Ted jeste zrychlit ten parsing :)
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)