Autor Téma: Zpomalování aplikace vytvořené ve starších Delphi na nových počítačích  (Přečteno 1332 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Ono to zde nerekne nikdo nahlas, protoze.... Ale byt delphi dnes delaji hafo veci navic, tak kvalita kodu jde obcas dolu rychleji, takze vysledek je ten, co pises. No a pak narazis na nejakou fakt kravinu (Kamerko zdar) a nestacis se divit. (Ale jo, muzes se zanorit do knihoven a ladit a zjistovat apod, ale obcas radeji nevedet, jak je to napsany :) )

Ale jen si rekni, co chces, jediný kdo tady dostal blok byl delfin a k tomu bych se nerad vracel.

Ad ta kamera - neni to kravina, kod ktery to zrychloval pouzival celkem hodne ciziho kodu, ktery se nedal použít rovnou, prislo mi ze je tam nějaký licenční problém pokud si pamatuji. Nic ti nebráni tu vychozi implementaci nepouzit, bohuzel nebyla optimalizovaná, to je někdy dan za multiplaformový vývoj, ale souhlasim ze to trvalo dlouho a mohlo to byt od zacatku lepsi. EMBT bylo na zacatcich FMX zalovano (nebo se k tomu schylovalo), ze kod ktery koupilli jako zaklad pro FMX obsahoval par procedur stejnych jako v GlScene aniz si to nekdo pamatoval, takže od te doby jsou extremne opatrni pri pouziti kodu treti strany.

ShowMessage jsme si ukazali, ze tam podle mne je spise problém spíše na strane windows s DPI a monitory, ale opravdu to moc nechápu (jedna se o FMX).

Embarcadero MVP - Czech republic

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 403
  • Karma: 15
    • Verze Delphi: FPC :D
Ad ta kamera - neni to kravina, kod ktery to zrychloval pouzival celkem hodne ciziho kodu, ktery se nedal použít rovnou, prislo mi ze je tam nějaký licenční problém pokud si pamatuji. Nic ti nebráni tu vychozi implementaci nepouzit, bohuzel nebyla optimalizovaná, to je někdy dan za multiplaformový vývoj, ale souhlasim ze to trvalo dlouho a mohlo to byt od zacatku lepsi. EMBT bylo na zacatcich FMX zalovano (nebo se k tomu schylovalo), ze kod ktery koupilli jako zaklad pro FMX obsahoval par procedur stejnych jako v GlScene aniz si to nekdo pamatoval, takže od te doby jsou extremne opatrni pri pouziti kodu treti strany.

Do detailu si to uz nepamatuju v cem presne byl problem, nicmene od vyrobce programovaciho jazyka opravdu necekam, ze uvede komponentu v takovem stavu. Zvlaste na mobilni platforme resici spotrebu. Pokud to nejsou schopni napsat sami nemaji takovou komponentu uvadet vubec. Jsou to pak tisice hodin vyvojaru, kteri si zakoupi nastroj a misto toho resi jeho vlastni opravy.
Bohuzel, tohle neni jen o kamere, ale i o Layout, Edit a dalsich. Jak si pred casem posilal ukazku skvele apky v delphi (seznamka ci co to bylo) tak bez komponent tretich stran by to takto pekne nelitalo ani nahodou (coz je videt i na demech tech komponent). Tohle zel neni o NUTNOSTI dane za multiplatformnost, ale o chybnem navrhu potazmo implementaci. Obecne je FMX prima, ale optimalizaci neoplyva a to tak, ze vubec. O dobe trvani oprav se nema cenu ani bavit, zde myslim, ze se dost shodneme. X let neopraveny kod je bezny.

ShowMessage jsme si ukazali, ze tam podle mne je spise problém spíše na strane windows s DPI a monitory, ale opravdu to moc nechápu (jedna se o FMX).

Problem neni na strane Windows. Problem je, ze toto - kdyz uz se o to snazi - Delphi nedelaji poradne.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
V každém případě po přesunutí kódu z pole stringů na StringList
Jestli jsi s tim polem zachazel podobne, jako jsi generoval ten random string, tak za tim muze byt schovan slusny overhead a v novych Delphi se z RTTI zjistuje, jestli polozka neni management typu a pripadne se s dalsim overheadem obsluhuje. Ale to by vsechno melo byt videt pri trasovani na urovni CPU okna.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
V každém případě po přesunutí kódu z pole stringů na StringList
Jestli jsi s tim polem zachazel podobne, jako jsi generoval ten random string, tak za tim muze byt schovan slusny overhead a v novych Delphi se z RTTI zjistuje, jestli polozka neni management typu a pripadne se s dalsim overheadem obsluhuje. Ale to by vsechno melo byt videt pri trasovani na urovni CPU okna.

Vypadá to, že TMemo je nepoužitelné, pokud nezáleží na rychlosti. Již od XE2 verze narážím na komponenty obsahující chyby. Jen pro Bluetooth jsem musel upravit pěkný kus kódu, aby mi fungoval LE mód bez problémů. Nedávno jsem zde psal o 3D, které obsahuj bugy, problémy s podprocedurami ....

Co se týče původního tématu, tak jeden typ EXE (z D6) na výkonnějším HW běhá o 50% pomaleji. Ty testy okolo ukázali, že HW je ok a že problém není u stringů (1B vs 2B). Problém vyřeším (jako vždy) přepsáním kódu. V tomto případě vyhodím TMemo - domnívám se, že je problém zde.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Excellent
Rated 1 time
Problém vyřeším (jako vždy) přepsáním kódu. V tomto případě vyhodím TMemo - domnívám se, že je problém zde.
Jestli mas nejaky vizualni widget jako soucast algoritmu, tak se jedna o nespravny navrh aplikace. To se da pouzit tak v nejakych Q&D toolech pri malych objemech dat. Jinak se pouziva architektura MVC a u vizualnich widgetu virtualni rezim tj. neobsahuji data a z  modelu si berou jen ta, ktera jsou momentalne videt.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
Problém vyřeším (jako vždy) přepsáním kódu. V tomto případě vyhodím TMemo - domnívám se, že je problém zde.
Jestli mas nejaky vizualni widget jako soucast algoritmu, tak se jedna o nespravny navrh aplikace. To se da pouzit tak v nejakych Q&D toolech pri malych objemech dat. Jinak se pouziva architektura MVC a u vizualnich widgetu virtualni rezim tj. neobsahuji data a z  modelu si berou jen ta, ktera jsou momentalne videt.

Prakticky vše co programuji má vizuální komponenty. Nedávno jsem řešil problém s TFileListBoxem a zobrazením desetitisíců souborů v jedné složce. Extrém, který bohužel nastal. Vysvětlovat uživateli, že práce (řazení / filtrování) s takto velkým seznamem prostě bude nějakou dobu trvat je zbytečné. Skončilo to tak, že v nové verzi mám vlastní komponentu, která je schopná zobrazit (filtrovat, řadit) soubory v takovém počtu bez viditelné prodlevy. Stejný problém vidím i u TMema - pokud pracuji s Lines (TStrings pokud si dobře pamatuji), tak by to nemělo překreslovat dokavaď  neskončím. 

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1199
  • Karma: 51
    • Verze Delphi: 10.3
Excellent
Rated 1 time
Stejný problém vidím i u TMema - pokud pracuji s Lines (TStrings pokud si dobře pamatuji), tak by to nemělo překreslovat dokavaď  neskončím.

Ono ale nejde jen o překreslování - jestli se nepletu, tak každé přidání řádku znamená, že se dělá SendMessage na handle toho tMemo (přeci jen je to potomek tWinControl). Je to SendMessage, tzn. čeká se na zpracování.

Kód: Delphi [Vybrat]
  1. procedure TMemoStrings.Insert(Index: Integer; const S: string);
  2. var
  3.   SelStart, LineLen: Integer;
  4.   Line: string;
  5. begin
  6.   if Index >= 0 then
  7.   begin
  8.     SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
  9.     if SelStart >= 0 then Line := S + #13#10 else
  10.     begin
  11.       SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index - 1, 0);
  12.       if SelStart < 0 then Exit;
  13.       LineLen := SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
  14.       if LineLen = 0 then Exit;
  15.       Inc(SelStart, LineLen);
  16.       Line := #13#10 + s;
  17.       if s = '' then
  18.         Line := Line + #13#10;
  19.     end;
  20.     SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart);
  21.     SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, Line);
  22.   end;
  23. end;
  24.  

S malými objemy dat je to přijatelné, na velké objemy už ne a musí se použít jiný přístup, jak psal už pf1957.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Ono ale nejde jen o překreslování - jestli se nepletu, tak každé přidání řádku znamená, že se dělá SendMessage na handle toho tMemo (přeci jen je to potomek tWinControl). Je to SendMessage, tzn. čeká se na zpracování.
No prave: ta komunikace s OS muze zahrnovat ruzne nelinearity podle toho, co se v tom stroji deje. Me treba v tom vcerejsim testu se TStringListem s puvodnim 1000 radku zhruba kazdy 100 pruchod testu probehl asi o 1/4 rychleji, nez ta stovka ostatnich, ale nijak jsem neresil, co v tom stroji momentalne bezi - to odpovidalo memu beznemu stavu.

A pokud si vzpominam, tak zrovna memo je u Windows dost problematicka kompomenta: puvodne to byl nejaky simple editor s omezenim na 32 kB, pak to nejak rozsirili, pak tam dali RTF editor atd. Takze je mozne, ze se na ruznych pocitacich vyskytuji ruzne verze.

A pokud jsme nepotrebovali skutecne textovy editor, tak jsme temer vsude pouzivali Lischkeho TVirtualEverything (VTV).
« Poslední změna: 06-05-2021, 08:47:52 od pf1957 »

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Já používám jako náhradu TMemoEx, který poskytuje jen jednoduché formátování (ale je potřeba použít poslední verzi 2.2 bez RALib, jelikož je tam spousta závislostí a z toho plynoucích chyb).

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 403
  • Karma: 15
    • Verze Delphi: FPC :D
vandrovnik> Husty.. Safr, bych fakt cekal (a viditelne nejen ja), ze begin/end update tyhle casti dost upozadi az za endupdate a do te doby se pracuje ciste s tStrings. (Nestudoval jsem kod kolem dopodrobna, vychazim jen z tebou zaslaneho)
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Safr, bych fakt cekal (a viditelne nejen ja), ze begin/end update tyhle casti dost upozadi az za endupdate a do te doby se pracuje ciste s tStrings. (Nestudoval jsem kod kolem dopodrobna, vychazim jen z tebou zaslaneho)
Naopak TStrings je jen abstraktni trida tj. spolecne rozhrani pro vechny ruzne varianty string listu, jejiz konkretni implementace u TWinControl neobsahuje data a jen je presouva mezi OS a API -> tak od sameho pocatku v D1 funguji vsechny widgety, ktery zapouzdruji standardni okno widgetu tj. maji jeho handle a komunikuji s nim vyhradne pres posilani zprav na to handle viz https://docs.microsoft.com/en-us/windows/win32/controls/individual-control-info

Docela velka dira ve znalostech ;-)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 403
  • Karma: 15
    • Verze Delphi: FPC :D
Docela velka dira ve znalostech ;-)

To mas recht, ale na mou obranu, velmi malokdy pisu Gui veci. Na druhou stranu, sam bych to navrhoval obracene, pripadne jakymsi externim lookupem na data.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 183
  • Karma: 2
    • Verze Delphi: 10.4.1
    • PSPad editor
Ještě na to může mít vliv windowsí kontrola kompatability.
Pokud se Windows něco nezdá (typicky starší aplikace), zařadí ji do seznamu a v podstatě ji online debuguje a kontroluje.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Ještě na to může mít vliv windowsí kontrola kompatability.
Pokud se Windows něco nezdá (typicky starší aplikace), zařadí ji do seznamu a v podstatě ji online debuguje a kontroluje.

To jako fakt? Nikdy jsem o tom neslysel - to se ti stalo?
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Excellent
Rated 1 time
A pokud si vzpominam, tak zrovna memo je u Windows dost problematicka kompomenta: puvodne to byl nejaky simple editor s omezenim na 32 kB, pak to nejak rozsirili, pak tam dali RTF editor atd. Takze je mozne, ze se na ruznych pocitacich vyskytuji ruzne verze.

Ja si myslim, ze nejmene dve verze jsou pokazde - jedna na urovni kompatibility Windows 2000 (tj. vzhled ala Win 95), druhá se použije když je definován manifest, tj. XP styly (XP, Vista, W7, W10). Proto jsem sem psal, ze se da manifest vypnout a pak je to podle vseho jiny TMemo a jine ComCtrls. Ale jak by rekl klasik, nyni uz ma ctenar vsechny indicie k dispozici...
Embarcadero MVP - Czech republic