Autor Téma: String helper - efektivnost  (Přečteno 450 krát)

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 502
  • Karma: 20
    • Verze Delphi: D2007, D10.4
String helper - efektivnost
« kdy: 16-10-2021, 02:02:43 »
Tak nejak sme vsetci tusili alebo vieme ze helpery pre rozne datove typy, triedy a ostatne asi nebudu tou najefektivnejsou zalezitostou, je to ako inac normalna cena za "pohodlnost a user fiendly pouzitelnost". Tento prispevok tu davam len preto aby ste si pripadne usetrili 3 hodiny hladania diery kde sa vam stracaju desiatky sekund strojoveho casu.

Neviem ci je to za tym narast poctu riadkov DB (co pri 500 riadkovej tabulke o menej ako 50tich stlpcoch dost pochybujem, aj ked vacsina z tych stlpcov je VarChar a NVarchar) alebo je za tym prechod z W7_32b na W10_64b. Neviem  :o .

Ale proste pri ukoncovani aplikacie som tuto tabulku exportoval do textoveho rezimu a vyuvzival som k tomu hojne moj vlastny helper pre datovy typ String a pri tych 500 riadkoch sa mi ten export natiahol na neuveritelnych 10 sekund. Pricom samotne "tahanie" dat z DB cez driver netvalo viac ako 1 az 2 sekundy.  :o

Po dlhom dlhom profilovani ked som volania string helperu ingoroval a hladal chybu inde som zistil, ze mi par volani string helperu predlzuje export dat  z necelych 2 sekund na takmer 10  :o

OMG

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:String helper - efektivnost
« Odpověď #1 kdy: 16-10-2021, 07:36:09 »
Po dlhom dlhom profilovani ked som volania string helperu ingoroval a hladal chybu inde som zistil, ze mi par volani string helperu predlzuje export dat  z necelych 2 sekund na takmer 10  :o
Ten string builder vytvaris s jakou kapacitou?

Vnitrni TArray<Char> ma default kapacitu jen 16 znaku a pri kazdem pripojeni retezce se zvetsuje jeho velikost 2x -> bude to casto realokovat dyn. pole a tudiz kopirovat dosavadni obsah na nove adresy.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2979
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:String helper - efektivnost
« Odpověď #2 kdy: 16-10-2021, 08:12:13 »
On mluví o string HELPERU, ne Builderu, tj. ze za string lze napsat napr. "neco".Trim.
Daniel: které ze stovek helperu pouzivas? Verim, ze nekde je overhead, ale nemyslim si ze by to platilo obecne. Vetsina helperu je inline funkce, která volá klasicky RTL, takže tam zadna ztrata neni.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:String helper - efektivnost
« Odpověď #3 kdy: 16-10-2021, 08:33:39 »
On mluví o string HELPERU, ne Builderu, tj. ze za string lze napsat napr. "neco".Trim.
Aha, no to me vubec nenapadlo - tam bych zadny podstatny rozdil neocekaval, protoze to je zalezitost jen prekladu a jak pises, za scenou by ten vysledny kod mel vypadat velmi podobne, jako kdyz to zapises bez tech extension funkci. Ale moc zkusenosti s temi helpery v Delphi nemam: ne, ze bych je nepouzival, ale v Delphi jsem toho posledni roky moc nedelal.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 502
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:String helper - efektivnost
« Odpověď #4 kdy: 16-10-2021, 21:33:07 »
No, pouzivam vlastny helper, viem ze nie je uplne najidealnejsi, ale koli paru volaniam v ramci jedneho projektu som ho dalej moc neoptimalizoval, ale aspon sa v nom vyznam.

V jednoduchosti vam tu skusim vystrihnut miesto kde to najviac viazne

Kód: Delphi [Vybrat]
  1. type
  2.   TasStringHelper = record helper for string
  3.   public
  4.     function _Add(const aText: string): string; inline;
  5.     procedure __Add(const aText: string); inline;
  6.     .
  7.     .
  8.     .
  9.     .
  10.   end;
  11.  
  12.  
  13. procedure TasStringHelper.__Add(const aText: string);
  14. begin
  15.   Self := Self._Add(aText);
  16. end;
  17.  
  18. function TasStringHelper._Add(const aText: string): string;
  19. begin
  20.   Result := Self + aText;
  21. end;
  22.  
  23. //A teraz funkcia ktora trva s helperom dlho:
  24.  
  25. function TDB.ExportTableAsSQL(const aTableName: string): string;
  26. var
  27.   c, r: Integer;
  28. begin
  29.   Result := Format('SET IDENTITY_INSERT "%s" ON',[aTableName]);
  30.   Result.__Add(Format('INSERT INTO %s (',[aTableName]));
  31.   for r := 0 to RS.ColumnCount-1 do
  32.   begin
  33.     Result.__Add(#9'(');
  34.  
  35.     for c := 0 to RS.ColumnCount-1 do
  36.     begin
  37.       .
  38.       .
  39.       .
  40.       .
  41.       Result.__Add(', '); //-> tu sa samozrejme nazbera najviac casu, vymenou za Result := Result + (', ') sa brutalne skrati cas vykonavania funkcie
  42.     end;
  43.     Result.__RemoveEnd(2);
  44.     Result.__AppendEOL;
  45.   end;
  46. end;
  47.  

Ako vidite funkcia exportuje tabulku do SQL formatu. Dalsim prieskumom som zistil ze ono dost zalezi jak velky ten resultset je. Jednotlive tabulky ktore exportuje ta funkcia maju v priemere 500 riadkov (a stlpcov par desiatok) co je nula nula nic. Teraz uz viem ze volania toho mojho helperu natiahnu vykonavnaie funkcie z priemernych cca 50ms na 100-150ms. To je zanedbatelne, cize som si toho ani nevsimol. Ale jedna tabulka je specialna v tom ze aj ked ma tiez len 500 riadkov a cca 50 stlpcov tak oproti inym takmer vsetky stlpce su nejaky Varchar alebo NVarchar. Takze oproti ostatnym tabulkam kde vysledny SQL text sa zvycajne pohybuje v max desiatkach kilobajtov tak SQL text tejto tabulky zabere niekolko malo stovak kilobajtov, mozno pol mega v priemere. A tuna potom dochadza k predlzeniu z 2s na skoro 10s pri pouziti toho helperu.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 502
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:String helper - efektivnost
« Odpověď #5 kdy: 16-10-2021, 21:33:44 »
V tomto pripade by asi bolo lepsie tak ako pise pf pouzit radsej nejaky ten string builder...

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 420
  • Karma: 15
    • Verze Delphi: FPC :D
Re:String helper - efektivnost
« Odpověď #6 kdy: 18-10-2021, 10:35:27 »
String builder klido pouzit, zde bych pouzil klido nejaky linkedlist.

Dotaz je ovsem na helpery a ten rozdil Add vs + je dost velkej. Je-li to skutecne tak
>predlzeniu z 2s na skoro 10s pri pouziti toho helperu
bude nekde velkej bordel.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)