Autor Téma: Zrýchlenie vnorených cyklov cez DataSet-y  (Přečteno 423 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Zrýchlenie vnorených cyklov cez DataSet-y
« kdy: 22-11-2023, 17:03:24 »

Existuje nejaká možnosť zrýchlenia nasledovných cyklov? Je to 2 254 x 13 = 29 302
Kód: Delphi [Vybrat]
  1.   var TeamField := TList<TField>.Create;
  2.   var PlayerField := TList<TField>.Create;
  3. .
  4.   while not FQryTeam.Eof do
  5.   begin
  6.    for var I := 0 to 12 do
  7.    begin
  8.      RoundGroup.Add(TRoundGroup.Create);
  9.      RoundGroup.Last.ID := TSQLTexts.NewPrimaryKey;
  10.      RoundGroup.Last.GroupId := PlayerField[0].AsInteger;
  11.      RoundGroup.Last.RoundID := TeamField[0].AsInteger;
  12.      FQry.Next;
  13.    end;
  14. .
  15.    FQryTeam.Next;
  16.   end;
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 445
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Zrýchlenie vnorených cyklov cez DataSet-y
« Odpověď #1 kdy: 23-11-2023, 05:15:10 »
Obligátní otázka - k čemu potřebuje uživatel vidět přes 2000 řádků?
Nebylo by rychlejší to mít rovnou v jednom datasetu vrácené z SQL serveru?

Další možností je vyřešit to "psychologicky" - zpracovat prvních 50 řádků, ty zobrazit a zbytek dodělat na pozadí. Než si uživatel prohlédne to, co mu naservíruješ, má k dispozici vše.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Zrýchlenie vnorených cyklov cez DataSet-y
« Odpověď #2 kdy: 23-11-2023, 08:30:27 »
To je príprava pre INSERT INTO. Žiadne zobrazovanie. Nastavenie parametrov z RoundGroup a samotný INSERT prebehnú rýchlo. Trvá to, odhadom, do 30 sekúnd. Ide mi o princíp, či existuje niečo čo by to skrátilo. TList<TField> akosi nepomohli.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zrýchlenie vnorených cyklov cez DataSet-y
« Odpověď #3 kdy: 23-11-2023, 09:30:36 »
To je príprava pre INSERT INTO. Žiadne zobrazovanie. Nastavenie parametrov z RoundGroup a samotný INSERT prebehnú rýchlo. Trvá to, odhadom, do 30 sekúnd. Ide mi o princíp, či existuje niečo čo by to skrátilo. TList<TField> akosi nepomohli.

Tam je podezrele to opakovane volani Last - to je invariant s buhvi jakym overheadem -> podivej se, jak ti to prekladac preklada, jestli to dokaze zoptimalizovat a ten pointer ziskat jen jednou:
Kód: Delphi [Vybrat]
  1.      RoundGroup.Add(TRoundGroup.Create);
  2.      RoundGroup.Last.ID := TSQLTexts.NewPrimaryKey;
  3.      RoundGroup.Last.GroupId := PlayerField[0].AsInteger;
  4.      RoundGroup.Last.RoundID := TeamField[0].AsInteger;
  5.  

nebo jestli si to musis zajistit sam (Pokud to Add zmeni poradi RoundGroup, tak 1. Last, jinak novou instanci TRoundGroup)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Zrýchlenie vnorených cyklov cez DataSet-y
« Odpověď #4 kdy: 23-11-2023, 10:40:48 »
Skúsim to s premennou. Dám vedieť.
Ďakujem.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Zrýchlenie vnorených cyklov cez DataSet-y
« Odpověď #5 kdy: 23-11-2023, 12:48:53 »
Použil som
Kód: Delphi [Vybrat]
  1. RndGrp := TRoundGroup.Create;
  2. RndGrp.ID := TSQLTexts.NewPrimaryKey;
  3. RndGrp.GroupId := PlayerField[0].AsInteger;
  4. RndGrp.RoundID := TeamField[0].AsInteger;
  5. RoundGroup.Add(RndGrp);
Časy sú rovnaké. 41 sek.
Rovnaký čas mám aj pri
Kód: Delphi [Vybrat]
  1. RoundGroup.Add(TRoundGroup.Create);
  2. RoundGroup.Last.ID := TSQLTexts.NewPrimaryKey;
  3. RoundGroup.Last.GroupId := FQry.FieldByName('PALYERID').AsInteger;
  4. RoundGroup.Last.RoundID := FQryTeam.FieldByName('TEAMFK').AsInteger;
« Poslední změna: 23-11-2023, 12:54:06 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.