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

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Oba EXE jsou generovány bez hlídání přetečení, debug informací atd. A ukázalo se, že Delphi 6 je o 100% rychlejší než Delphi 10.4 alespoň co se týče práce se stringy.
...
Pro mě to je překvapení, protože bych očekával, že novější verze bude minimálně stejně rychlá, ne-li rychlejší. Takové zpomalení je zarážející.


Nic z toho se neukázalo. Ukázalo se, že to co si myslíš ty že má vliv má zanedbatelný vliv a ve skutečnosti jsi měřil vliv úplně něčeho jiného, takže veškeré závěry co jsi zde publikoval jsou špatné.

Proto zde nerad publikuji kódy, zvlášť vytvořené pro jednoduché testy. Jak jsem psal, lze jít do extrému a vytvořit třebas non-vizuální komponentu. Vy obhajujete to co prodáváte - beru, že z toho důvodu výsledky neakceptujete. Z logiky, pokud si myslíte, že TMemo z Delphi 10.4 může zanést několikasekundovou chybu, tak se dál není třeba dohadovat. Neřeším +-100ms, ale rozdíl v řádku sekund je zarážející. 
¨
Ach jo,

a) nic neprodavam, jen se snazim na pravou miru uvest spatnou informaci
b) test byl spatne a uvedl jsem kde je chyba a na cem to muze zaviset

mimochodem mel jsem Memo takto:
Kód: Delphi [Vybrat]
  1.   object Memo1: TMemo
  2.     Left = 88
  3.     Top = 80
  4.     Width = 357
  5.     Height = 89
  6.     Lines.Strings = (
  7.       'Memo1')
  8.     TabOrder = 1
  9.   end
  10.  

c) provedl jsem stejny test i pro D2007 (starsi nemam) a vysledek s Memo byl plus minus stejny jako v 10.4.2, StringList byl srovnatelny uplne
d) z celeho vlakna mi prijde ze mas divny procesor, ktery se spatne hlasi, bezi na divnych taktech a vubec. Doporucuji CPU-Z, identifikovat procesor, spustit v nem benchmark a tam si porovnat vykon s databazi
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Proto zde nerad publikuji kódy, zvlášť vytvořené pro jednoduché testy.
Hm, publikovani obecne i na te nejvyssi odborne urovni je jedina cesta, jak overit, ze neziju v bludech... Test by mel byt jednoduchy, ale prave proto by mel byt zavisly na co nejmene faktorech.

Citace
Vy obhajujete to co prodáváte - beru, že z toho důvodu výsledky neakceptujete.
Ja nic neprodavam, a jako duchodce ani sebe a taky mi to prijde vic nez podezrele, ostatne proto se tim vubec zabyvam.

Publikací kódu vznikají většinou zbytečné narážky ve smyslu: to bych naprogramoval lépe / na méně řádků, tam použij byte místo int a ušetříš 3 bajty atd... Odezvu na TMemo a TButton jsem předvídal - a přišla... přestože je v podstatě zbytečná.

Ta část s prodejem byla reakce na pana Červinku. To, že jste nezaznamenal rozdíl mezi D7 a Delphi 10.2 je zajímavé. Mohl by to být stejný případ jako u Core i3, kdy obě verze trvali stejně dlouho - cca 9000ms.

 

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Pojďme tedy udělat test tak jak by měl být správně. Napište mi kód a já jej vygeneruji v Delphi 6 a Delphi 10.4 a provedu test na všech 3 HW, které mám teď u sebe.

K té detekci CPU jsem zadal dotaz u výrobce. S největší pravděpodobností je to způsobené virtualizací jiného OS na jednom z jeho jader. Důkladné testy HW jsem osobně nedělal, ale věřím jiné osobě, která diagnostikovala jak Celeron tak Core i3 a výkonnostně vše sedělo, tj. nejedená se o žádné vadné HW.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Pojďme tedy udělat test tak jak by měl být správně. Napište mi kód a já jej vygeneruji v Delphi 6 a Delphi 10.4 a provedu test na všech 3 HW, které mám teď u sebe.

Staci kdyz vezmeme tvuj kod a pridame ho jako obsluhu druheho tlacitka a pridal jsem tri rady v cyklu

U mne D2007 - 210ms, DXE - 250,  D10.4.2 - 260ms

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2.     var
  3.       c: cardinal;
  4.       a: integer;
  5.       s: string;
  6.       iFrequency, iTimerStart, iTimerEnd: Int64;
  7.       sl: TStringList;
  8.     begin
  9.       Screen.Cursor := crHourglass;
  10.       QueryPerformanceFrequency(iFrequency);
  11.       QueryPerformanceCounter(iTimerStart);
  12.  
  13.       randseed := 1;
  14.  
  15.       sl := TStringList.Create;
  16.       sl.Clear;
  17.       sl.BeginUpdate;
  18.       try
  19.         for c := 0 to 1000000 do
  20.         begin
  21.           s := Chr(ord('a') + Random(26)) + Chr(ord('A') + Random(26)) + Chr(ord('0') + Random(10)) + Chr(ord('a') + Random(26)) + Chr(ord('A') + Random(26)) + Chr(ord('0') + Random(10)) + Chr(ord('a') + Random(26)) + Chr(ord('A') + Random(26)) + Chr(ord('0') + Random(10));
  22.           sl.Add(s);
  23.         end;
  24.       finally
  25.         sl.EndUpdate;
  26.       end;
  27.  
  28.       sl.BeginUpdate;
  29.       try
  30.         for c := 0 to sl.Count - 1 do
  31.           if length(sl[c]) > 0 then
  32.           begin
  33.             s := sl[c];
  34.             for a := 1 to length(sl[c]) do
  35.             begin
  36.               if s[a] = 'A' then s[a] := '*';
  37.               if s[a] = 'E' then s[a] := '*';
  38.               if s[a] = 'I' then s[a] := '*';
  39.               if s[a] = 'O' then s[a] := '*';
  40.               if s[a] = 'U' then s[a] := '*';
  41.             end;
  42.             sl[c] := s;
  43.           end;
  44.  
  45.       finally
  46.         sl.EndUpdate;
  47.       end;
  48.  
  49.       QueryPerformanceCounter(iTimerEnd);
  50.       Button2.Caption := intToStr(round(1000 * ((iTimerEnd - iTimerStart) / ifrequency))) + ' ms';
  51.       Screen.Cursor   := crDefault;
  52.       sl.Free;
  53.  
  54. end;
  55.  
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Výsledky:


Delphi 10.4:
Core i5 - 360 ms
Core i3 - 644 ms
Celeron - 1100 ms

Delphi 6:
Core i5 - 420 ms
Core i3 - 790 ms
Celeron - 1280 ms

Toto jsou časy, které se mi líbí a tak by to mělo být.

Můj závěr je ten, že TMemo ve Windows 10 (ať už generované v Delphi 6 nebo Delphi 10.4) vykazuje mnohem vyšší zátěž na CPU. Jinak si neumím vysvětlit, proč práce se stringy EXE generovaný v Delphi 6 trvá o více než 100% déle.

EDIT: NEVÍM ...

Nebo se pletu?
« Poslední změna: 05-05-2021, 11:34:47 od age.new »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
TMemo je vizualni komponenta, ktera jen zapouzdruje windows prvek. D6 verze TMemo muze pouzivat jinou verzi windows prvku (jsou v systemu ve vice verzich) - nevim a nechci to resit, protoze to nema moc vyznam. Casove narocne operace by nemeli byt delany nad vizualnimi prvky (to je ta namitka), ale jen do nich strcit vysledek.

Ale jen mala poznamka, D6 pouzival jiny spravce pameti, tj. kdyby se v D6 pouzil FastMM, tak bude pravdepodobneji i rychlejsi (jak psal vandrovnik 1byte string, navic samostatny FastMM je nastaven trosku jinak, nez ten co je integrovan v Delphi od verze 2006). Proto taky D2007 byl u mne rychlejsi (obsahuje cast optimalizaci z novejsich delphi, obsahuje FastMM a ma 1byte retezce -> mel byt nejrychlejsi)
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Jsem zmatený z výsledku.

FAKT #1:
Poslední test ukázal, že procesory pracují jak mají, resp. nejpomalejší je celeron, pak i3 a pak i5. To platí pro EXE generované v Delphi 6 i Delphi 10.4.

FAKT #2:
Stejný kód generovaný v Delphi 6 i Delphi 10.4 se zobrazením v TMemo ukázal, že Delphi 6 byl ve dvou případech o 100% rychlejší.

FAKT #3:
EXE generovaný v Delphi 6 spuštěný na Celeronu (Windows 7) je o cca 100% rychlejší než u Core i3 (Windows 10)
 
....

FAKT 3 se mi bije s FAKTem 1. U FAKTu 2 to vypadá, že TMemo v Delphi 10.4 je neoptimalizované a pomalé. Možná jsem si to špatně přeložil, ale domníval jsem se, že úpravy v TMemo mezi BeginUpdate a EndUpdate přeskakuje kód s "vizuální" obsluhou. V každém případě mě TMemo velmi zklamala protože zpomalení je ASTRONOMICKÉ a asi si budu muset naprogramuji vlastní komponentu. 

« Poslední změna: 05-05-2021, 11:59:08 od age.new »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6163
  • Karma: 44
    • Verze Delphi: W10 + D11
Pripomeniem čo napísal Radek:
  • Neplniť Memo riadok po riadku
  • Najprv si výsledok niekam uložiť (TStringList) a ten naraz celý poslať do Memo
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Možná jsem si to špatně přeložil, ale domníval jsem se, že úpravy v TMemo mezi BeginUpdate a EndUpdate přeskakuje kód s "vizuální" obsluhou. V každém případě mě TMemo velmi zklamala protože zpomalení je ASTRONOMICKÉ a asi si budu muset naprogramuji vlastní komponentu. 

V okamziku EndUpdate vynutis prekresleni memo. Hodne stesti s programovanim. Jen si pro zajimavost jeste nastav u projektu v novych Delphi manifest podle obrazku v priloze, aby ses dostal blize zastaralemu chovani D6. Poznas to za behu ze pak tlacitko bude vypadat jak z Windows 95.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Publikací kódu vznikají většinou zbytečné narážky ve smyslu: to bych naprogramoval lépe / na méně řádků, tam použij byte místo int a ušetříš 3 bajty atd... Odezvu na TMemo a TButton jsem předvídal - a přišla... přestože je v podstatě zbytečná.
Ty narazky nejsou zbytecne: z nich plyne pouceni, ze nekdo neco umi lip a neco zase ne.

U programatora bych ocekaval, ze nesklouzne do polohy, s jakou pologramotna vetsina naroda pristupuje napr. k vyzive drubeze: "moje babicka to tak delala, tak to tupe opakuju a tak je to spravne a tak to ma bejt" :'(

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
Chlapi, klidek. Myslim, ze je faktem, ze novejsi delphi (ktere jak pise Radek delaji o hodne vice prace) jsou bohuzel obcas pomalejsi (a o kvalite komponent se da hodne diskutovat - Kamera na mobilu nebo obecne visualni komponenty, ktere nejsou vubec optimalizovane (jak mohou byt, coz dokazuji alternativni komponenty)), ci nedejboze help :) .

Pak se nedivme tomu, ze se nekdo koukne na aplikaci a je mu divne, ze uloha to trva nekolikrat tak dlouho. Chce to ale trochu pochopeni, neb vyvojovy nastroj si koupite proto abyste vyvijeli a ne proto, abyste resili, ze najednou je to o hooodne pomalejsi, ci zakladni procedury maji najednou bugy (ShowMessage) :)
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1301
  • Karma: 51
    • Verze Delphi: 10.3
Kamera na mobilu

V 10.4.2 se zdá, že konečně opraveno :-)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Publikací kódu vznikají většinou zbytečné narážky ve smyslu: to bych naprogramoval lépe / na méně řádků, tam použij byte místo int a ušetříš 3 bajty atd... Odezvu na TMemo a TButton jsem předvídal - a přišla... přestože je v podstatě zbytečná.
Ty narazky nejsou zbytecne: z nich plyne pouceni, ze nekdo neco umi lip a neco zase ne.

U programatora bych ocekaval, ze nesklouzne do polohy, s jakou pologramotna vetsina naroda pristupuje napr. k vyzive drubeze: "moje babicka to tak delala, tak to tupe opakuju a tak je to spravne a tak to ma bejt" :'(

Nerad o sobě tvrdím, že jsem programátor protože jsem znal Programátora, který byl znalostmi / matematikou / inteligencí mimo moje chápání.... To, že napíšu kód, otestuji a ten pak běhá na stovkách strojů bez problémů a najednou se po 5ti letech objeví problém, tak je logické, že prvně hledám problém jinde, než v Delphi - v mém kódu. Sám nevím, proč totožná aplikace běhá na silnějším HW s Windows 10 tak pomalu. V každém případě po přesunutí kódu z pole stringů na StringList a poté zkopírováním TStringList.Lines.Text do Mema je zatím nejrychlejší a asi přijatelné řešení.

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
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 :) )
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Sám nevím, proč totožná aplikace běhá na silnějším HW s Windows 10 tak pomalu.
No to na zaklade uvedenych informaci nevi nejspis nikdo, navic pokus problem zopakovat se nepovedl. Ale porad vidim, ze zde michas jeden exe na ruznych strojich s ruznymi prekladaci. Lokalizace problemu v obou pripadech vyzaduje nejakou dekompozici na podsystemy a jejich postupne vylucovani.