Autor Téma: Vysoké CPU zatížení aplikace  (Přečteno 7180 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Vysoké CPU zatížení aplikace
« kdy: 14-10-2015, 14:49:27 »
Zdravím,

mohl bych se na Vás obrátit se zvláštním problémem s aplikací vytvořenou v Delphi 6?

Kdysi jsem prováděl úpravy v kódu tak, aby vytížení v IDLE stavu bylo průměrně 6% a při činnosti 60%. Pár týdnů nazpět (neznám přesně časový bod kam se vrátit) najednou narostlo vytížení DVOJNÁSOBNĚ, tj. v IDLE se vytížení pohybuje kolem 20% a při činnosti u 100%. To způsobuje nedostatek CPU pro další procesy a aplikace se začne zadrhávat.

Při testování jsem zpozoroval zvláštní věc: z mě neznámých příčit se někdy stalo, že se vytížení vrátilo zpět do nižších čísel! Z ničeho nic! Stejný exe soubor! Prostě jsem aplikaci ukončil, opět spustil a bylo vše v pořádku! To ale nastává pouze vyjímečně. Vzhledem k této skutečnosti si nemyslím, že je chyba v kódu...  ale někde "jinde"

Setkal se někdo s něčím podobným?

Děkuji.
AG

   

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:Vysoké CPU zatížení aplikace
« Odpověď #1 kdy: 14-10-2015, 20:07:41 »
Kde by byla chyba, když ne v kódu? Pokud je to zatížené, tak to asi něco dělá. Zkusil bych použít  profiler a podívat se, kde to tráví čas.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3554
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Vysoké CPU zatížení aplikace
« Odpověď #2 kdy: 14-10-2015, 20:41:28 »
Spravně - použij https://www.delphitools.info/samplingprofiler/
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #3 kdy: 15-10-2015, 07:49:56 »
Děkuji za link na SamplingProfiler. Chvilku jsem si s ním hrál, ale výsledky mě moc neuspokojují - když jsem jej nastavil tak, aby se spustil po bezpečné době a zachytával jen IDLE stav aplikace, tak za 30 sekund mělo největší počet zachycení Graphics knihovna (celkem 67). Následovala Classes (17) a další s menším počtem. Ale NIC z ostatních zdrojáků aplikace, které jsem vytvořil.

Jinak jsem nechal celou noc sledovat CPU zatížení aplikace a ráno běželo na nižších číslech celkového zatížení. Nic jsem neudělal - jen jsem alt-tabem prošel pár oken a vrátil se zpět do aplikace ... a najednou opět zatížení 2x vyšší. Z ničeho nic!

Jsem z toho celý zmatený.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #4 kdy: 15-10-2015, 08:56:19 »
Asi jsem přišel na příčinu, proč se generuje neobvyklé zatížení CPU při IDLE stavu, které má patrně souvislost i se zatížením při činnosti aplikace. Zjistil jsem, že když zruším Timer, který kreslí každou sekundu aktuální čas na Label (Tahoma, netransparentní), tak klesne vytížení na nulu. Při činnosti aplikace dochází k aktualizaci dalších labelů (cca šesti), které zatíží CPU na 100%. Aktualizace je cca 5x za sekundu.

Proč je schopno vykreslování pár labelů vytížit CPU na 100%?


Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Vysoké CPU zatížení aplikace
« Odpověď #5 kdy: 15-10-2015, 08:59:18 »
Mně se vysoké zatížení CPU objevilo, když jsem chybně začal řídit property Enabled u nějaké akce ze dvou míst, jednou z události OnUpdate a podruhé odněkud z kódu. Pak neustálé překreslování položek podle stavu akce způsobilo vytížení CPU. Ale jen tehdy, když formulář existoval.
Pak je další spousta možností, jak vytížit CPU. Spousta Create/Destroy nějakého objektu, nějaký nekonečný cyklus, atd. Nezbude, než zapoznámkovat kód a testovat, až to přestane dělat.
Win10 Prof 64b, Firebird 2.5

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #6 kdy: 15-10-2015, 09:28:40 »
Label se stará o Paint. Jen nevím co způsobí, že jeho překreslování je tak náročné na CPU. Testovací aplikace jen s časovačem a rychlým aktualizováním labelů nám vykazovala nulové zatížení. Ale prostě v našem projektu je zátěž vysoká. A sám jsem se s tím setkal i v jiných projektech.

Dotaz na zkušené programátory - nemůže změna Labelu vyvolat repaint i jiných komponent na Formu?

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Vysoké CPU zatížení aplikace
« Odpověď #7 kdy: 15-10-2015, 09:39:13 »
Podle mě může, pokud má label zapnuté AutoSize nebo má pozicování (Anchors, Align...) jiné než doleva nahoru.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #8 kdy: 15-10-2015, 09:56:52 »
Tak změna některých parametrů Labelu se neprojevila na výkonu aplikace. Kolega si ale všiml, že když skryje cca polovinu komponentů (statických, neprovádějící žádné změny) na formuláři (na kterém je každou sekundu aktualizovaný Label), tak zatížení CPU klesne též přibližně o polovinu. Zkusím si to otestovat ...
« Poslední změna: 15-10-2015, 09:59:26 od age.new »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #9 kdy: 15-10-2015, 10:24:29 »
Tak potvrzeno, zátěž aplikace, respektive změna Captionu na labelu, roste s počtem dalších komponent na formuláři! Navíc se nám projevil problém se kterým jsem se setkal na začátku - z ničeho nic naroste zátěž dvojnásobně! I když se nic neudělá, nespustí, neaktivuje. Samo od sebe....

EDIT: Nové zjištění: když se Label umístí na Panel, tak zatížení klesne na nulu!
« Poslední změna: 15-10-2015, 10:48:28 od Radek Červinka »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3554
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Vysoké CPU zatížení aplikace
« Odpověď #10 kdy: 15-10-2015, 10:48:11 »
No a nevinucujes nejak prekresleni toho formulare? Je to normální TLabel?
Pokud to vyresi panel, tak to neres :-)

A nepouzivej velky font!
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #11 kdy: 15-10-2015, 10:53:58 »
Ano, je to obyčejný TLabel. Velikost fontů je od 8 do 11.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Vysoké CPU zatížení aplikace
« Odpověď #12 kdy: 15-10-2015, 11:00:12 »
Ano, je to obyčejný TLabel. Velikost fontů je od 8 do 11.
Ja uz si to nepamatuju, ale TLabel neni potomkem TWinControl, takze mam dojem, ze pise do Canvasu parenta a je mozne, ze to vyvola tak nejake nezadouci eventy.
Zkus pouzit TStaticText nebo jak se to jmenoval ev. ho podloz nejakym panelem, jehoz prekresleni nebude mit takovy overhead.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3554
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Vysoké CPU zatížení aplikace
« Odpověď #13 kdy: 15-10-2015, 11:07:08 »
Ano, je to obyčejný TLabel. Velikost fontů je od 8 do 11.
Ja uz si to nepamatuju, ale TLabel neni potomkem TWinControl, takze mam dojem, ze pise do Canvasu parenta a je mozne, ze to vyvola tak nejake nezadouci eventy.
Zkus pouzit TStaticText nebo jak se to jmenoval ev. ho podloz nejakym panelem, jehoz prekresleni nebude mit takovy overhead.

Ano TLabel je custom control, který byl vytvořen specialně pro zrychlení kreslení proti TStaticText,  s tím TStaticText máš taky pravdu.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Vysoké CPU zatížení aplikace
« Odpověď #14 kdy: 15-10-2015, 11:54:28 »
Tak podložení všech kritických Labelů panely přineslo velké snížení zátěže jak v IDLE stavu, tak při činnosti aplikace.