Autor Téma: Zpomalování aplikace vytvořené ve starších Delphi na nových počítačích  (Přečteno 1366 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ě
Níže jsou parametry:

CPU                               1 x x86 - 2720 MHz
Memory                         8192 MB DDR4
Video Adapter                Intel(R) HD Graphics 620 - 1024 MB
HDD SATA                      M.2 (S80) 3MV2-P - 476 GB


No myslel jsem screenshot, kde je vice informaci, ale podle te grafiky mas pravdu ze je to nejaky Kaby lake. Ale cele je to nejake divne, jako by byl cely system rozbity, mne to pripade jako nejaky virtualni pocitac. Muzes zkusit treba CPU-Z a pokud ani ten to neukaze, tak to muze byt nejaky zasadni problem , protoze pocitace uz x let se hlasi korektne a pokud ne, tak je to hodne podezrele a neco hodne smrdi, takze tezko rict.

Uz to ze to detekoval jako 32bit CPU (1 x x86 misto x64) je zvracene. Opravdu to neni nejaka virtualni mašina?
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
Virtuální stroj to určitě není - koukám na něj a leží na stole. Je ale možné, že na druhém jádru běží nějaká virtualizace.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Virtuální stroj to určitě není - koukám na něj a leží na stole. Je ale možné, že na druhém jádru běží nějaká virtualizace.
Me v pocitaci trvale bezi Process Monitor od SysInternals a jakmile se mi neco nezda, tak prvni, co zkoumam, je co mi to v pocitaci bezi a jak se to chova, takze tim bych osobne zacal a pak si mozna zkusil pohrat s afinitou jader, jak to ovlivni.

Ale zadnou hypotezu, ktera by to chovani vysvetlovala, nemam.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
Provedl jsem malý test - vytvořil jsem si aplikaci, která generovala náhodné stringy (se stejným seedem) a poté nahradila určené znaky za jiné. Aplikaci jsem vygeneroval v Delphi 6 a v Delphi 10.4. Výsledky jsou podivné!

Delphi 6:
- Core i5-4690 3.5Ghz, Win 10 - čas cca: 3000ms
- Core i3-7130u 2.7GHz, Win 10 - čas cca: 9000ms
- Celeron 1047UE 1.4GHz, Win 7 - čas cca: 7000ms

Delphi 10.4:
- Core i5-4690 3.5Ghz, Win 10 - čas cca: 6000ms
- Core i3-7130u 2.7GHz, Win 10 - čas cca: 9000ms
- Celeron 1047UE 1.4GHz, Win 7 - čas cca: 19000ms

Co z toho plyne? Že kód v Delphi 6 je rychlejší než kód v Delphi 10.4.
To, že na Core i3 oba kódy běželi stejně rychle si neumím vysvětlit.

Nějaký závěr zdejších odborníků na Delphi?

Děkuji.


Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1199
  • Karma: 51
    • Verze Delphi: 10.3
Ve starých Delphi 1 znak = 1 bajt.
V současných Delphi 1 znak = 2 bajty.
Tzn. pro stejné množství práce bylo potřeba dvojnásobek přesunů dat mezi CPU a pamětí.

Proč na i3 jsou časy stejné, netuším - nespustil jsi omylem dvakrát .exe ze starých Delphi? ;-)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Ve starých Delphi 1 znak = 1 bajt.
V současných Delphi 1 znak = 2 bajty.
Tzn. pro stejné množství práce bylo potřeba dvojnásobek přesunů dat mezi CPU a pamětí.

Proč na i3 jsou časy stejné, netuším - nespustil jsi omylem dvakrát .exe ze starých Delphi? ;-)

Navic, je mozne, ze tam mas nejake warningy ohledne konverze stringu a delphi to implicitne vyresi volanim konverznich rutin. Co jsem drive zkousel https://delphi.cz/post/Scimark-a-Delphi-XE2.aspx tak rychlost byla srovnatelna, naopak s vyssimi verzemi se zvysovala - ale netestoval jsem praci s retezci, kde jak pise vandrovnik to muze mit vyznam.
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ě
Provedl jsem malý test - vytvořil jsem si aplikaci, která generovala náhodné stringy (se stejným seedem) a poté nahradila určené znaky za jiné. Aplikaci jsem vygeneroval v Delphi 6 a v Delphi 10.4. Výsledky jsou podivné!

Delphi 6:
- Core i5-4690 3.5Ghz, Win 10 - čas cca: 3000ms
- Core i3-7130u 2.7GHz, Win 10 - čas cca: 9000ms
- Celeron 1047UE 1.4GHz, Win 7 - čas cca: 7000ms

Delphi 10.4:
- Core i5-4690 3.5Ghz, Win 10 - čas cca: 6000ms
- Core i3-7130u 2.7GHz, Win 10 - čas cca: 9000ms
- Celeron 1047UE 1.4GHz, Win 7 - čas cca: 19000ms

Co z toho plyne? Že kód v Delphi 6 je rychlejší než kód v Delphi 10.4.
To, že na Core i3 oba kódy běželi stejně rychle si neumím vysvětlit.

Nějaký závěr zdejších odborníků na Delphi?

Děkuji.



Tak sem soupni zdrojak, jinak je to vesteni z rozbite kristalove koule.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
Níže je kód. Na formu je TMemo a TButton.

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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Ve starých Delphi 1 znak = 1 bajt.
V současných Delphi 1 znak = 2 bajty.
Tzn. pro stejné množství práce bylo potřeba dvojnásobek přesunů dat mezi CPU a pamětí.

Proč na i3 jsou časy stejné, netuším - nespustil jsi omylem dvakrát .exe ze starých Delphi? ;-)

Navic, je mozne, ze tam mas nejake warningy ohledne konverze stringu a delphi to implicitne vyresi volanim konverznich rutin.

Proto jsem se ho vcera ptal, jestli na ruznem HW testuje stejny .EXE prelozeny v D6/7, protoze to je skutecne divne.

Tohle uz je jina disciplina, protoze zalezi, ceho presne chce dosahnout tj. jake operace se presne srovnavaji, zda jsou oba prekladace stejne nastaveny, jak presne vypada vlastni test atd. V obecne rovine IMHO nema takova diskuse vyznam.

Pokud se meni prekladac, tak je nejjednoduzsi se podivat do CPU okna v debuggeru, jak se lisi preklad, pokud se lisi.



Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
Ve starých Delphi 1 znak = 1 bajt.
V současných Delphi 1 znak = 2 bajty.
Tzn. pro stejné množství práce bylo potřeba dvojnásobek přesunů dat mezi CPU a pamětí.

Proč na i3 jsou časy stejné, netuším - nespustil jsi omylem dvakrát .exe ze starých Delphi? ;-)

Navic, je mozne, ze tam mas nejake warningy ohledne konverze stringu a delphi to implicitne vyresi volanim konverznich rutin.

Proto jsem se ho vcera ptal, jestli na ruznem HW testuje stejny .EXE prelozeny v D6/7, protoze to je skutecne divne.

Tohle uz je jina disciplina, protoze zalezi, ceho presne chce dosahnout tj. jake operace se presne srovnavaji, zda jsou oba prekladace stejne nastaveny, jak presne vypada vlastni test atd. V obecne rovine IMHO nema takova diskuse vyznam.

Pokud se meni prekladac, tak je nejjednoduzsi se podivat do CPU okna v debuggeru, jak se lisi preklad, pokud se lisi.

Teď se míchají jablka a hrušky. Poslední test mi měl ukázat, zda není problém mezi Delphi 6 a Windows 10.

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. Pokud chcete jít do extrému, je možné vymazat grafické čísti jako Memo a Button, protože ty se v rámci Delphi verzí liší a obsluha vykreslení tak může negativně ovlivnit výsledek a nahradit je poli.

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í.

Když se ale vrátím k původní otázce tohoto vlákna, tak EXE bylo vygenerované v Delphi 6 a ten byl spuštěný na 3 různých počítačích s různým HW. A pouze ta Core i3 (v tomto definovaném případě) vykázala výrazné zpomalení oproti testu na Celeronu.

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
Níže je kód. Na formu je TMemo a TButton.
...

To si delas strandu? Ty porovnavas vysledek za pouziti visualnich komponent? Uz jen to ze nove Delphi pouzivaji jako vychozi win komponenty uvedene z XP (schvalne nepisi styly), ktere jsou casove narocnejsi, navic maji podporu pro DPI atd. Je tam spousta neznamých informací.

Musel by jsi pouzit nejmene TStringList misto TMemo aby to melo aspon nejakou vypovidajici hodnotu.
A kdyz pouziji TStringList ve stejnem kodu, tak najednou je doba provádění 0ms, a musím přidat aspon dva řády v cyklu aby se něco vubec změřilo.
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ě
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é.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 0
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í aplikaci. 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í. 
« Poslední změna: 05-05-2021, 10:19:33 od age.new »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Nic z toho se neukázalo.
Me to pripada natolik exoticke, ze jsem to take vyzkousel a musim to potvrdit.

Sice nemam D6, ani D10.4, ale zkousel jsem to na  D7 vs. D10.2 a nenameril jsem statisticky vyznamny rozdil ani proti memo, ani proti TStringListu - tam jsem si nechal zobrazit µs.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Excellent
Rated 1 time
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.