Optimalizace využití paměti vašeho Delphi programu

Při psaní dlouhodobých aplikací - druh programů, které stráví většinu dne minimalizovanou na hlavní panel nebo systémová lišta, může být důležité nenechat program „utéct“ s využitím paměti.

Dva sloupce zcela vpravo označují využití CPU (čas) a využití paměti. Pokud proces na některý z nich působí vážně, váš systém se zpomalí.

Druhem, který často ovlivňuje využití CPU, je program, který opakuje (zeptejte se každého programátora, který zapomněl vložit příkaz „read next“ do smyčky pro zpracování souborů). Tyto druhy problémů jsou obvykle poměrně snadno napraveny.

Na druhé straně využití paměti není vždy zřejmé a musí být spravováno více než opraveno. Předpokládejme například, že je spuštěn program typu snímání.

Tento program se používá po celý den, pravděpodobně pro telefonické zachycení na helpdesku, nebo z nějakého jiného důvodu. Jen to nedává smysl ho vypínat každých dvacet minut a pak jej znovu spustit. Použije se po celý den, i když v řídkých intervalech.

Pokud se tento program spoléhá na nějaké těžké vnitřní zpracování nebo má spoustu uměleckých děl na svých formách, dříve či později

instagram viewer
využití paměti bude růst, zanechává méně paměti pro další častější procesy, zvyšuje aktivitu stránkování a nakonec zpomaluje počítač.

Řekněme, že se chystáte navrhnout program s hlavní formou a dvěma dalšími (modálními) formami. Typicky, v závislosti na vaší verzi Delphi, Delphi vloží formuláře do projektová jednotka (Soubor DPR) a bude obsahovat řádek pro vytvoření všech formulářů při spuštění aplikace (Aplikace. CreateForm (...)

Řádky obsažené v projektové jednotce jsou navrženy společností Delphi a jsou skvělé pro lidi, kteří nejsou s Delphi seznámeni nebo jej právě začínají používat. Je to pohodlné a užitečné. To také znamená, že VŠECHNY formuláře se vytvoří při spuštění programu a NE, když jsou potřeba.

V závislosti na tom, o čem je váš projekt a funkčnost, kterou jste implementovali, může formulář využít spoustu paměti formuláře (nebo obecně: objekty) by měly být vytvářeny pouze v případě potřeby a zničeny (uvolněny), jakmile již přestanou nutné.

"DialogForm" i "OccasionalForm" je třeba odstranit ze seznamu "Automatické vytváření formulářů" a přesunout do seznamu "Dostupné formuláře".

Vezměte prosím na vědomí, že zde nastíněná strategie je založena na předpokladu, že daný program je programem typu „zachycení“ v reálném čase. Lze jej však snadno přizpůsobit pro procesy dávkového typu.

Delphi se pokusil minimalizovat toto a má svou vlastní architekturu správy paměti, která používá mnohem menší bloky, ale to je prakticky zbytečné v prostředí Windows, protože přidělování paměti nakonec spočívá na operačním systému.

Jakmile systém Windows přidělí proces paměti a tento proces uvolní 99,9% paměti, Windows stále vnímají celý blok, který se používá, i když ve skutečnosti je pouze jeden bajt bloku použitý. Dobrou zprávou je, že systém Windows poskytuje mechanismus k odstranění tohoto problému. Prostředí nám poskytuje API s názvem SetProcessWorkingSetSize. Zde je podpis:

Podle definice funkce SetProcessWorkingSetSize nastavuje minimální a maximální velikost pracovní sady pro určený proces.

Účelem tohoto rozhraní API je umožnit nastavení nízké úrovně minimálních a maximálních limitů paměti pro prostor využití paměti procesu. Má však v sobě zabudovaný malý šílenec, který je nejšťastnější.

Pokud jsou jak minimální, tak maximální hodnoty nastaveny na $ FFFFFFFF, API dočasně ořízne velikost sady na 0, vymění ji z paměti a okamžitě jako poskakuje zpět do RAM, bude mít k dispozici holé minimální množství paměti (to vše se děje během několika nanosekund, takže uživateli by mělo být nepostřehnutelné).

Volání na toto API bude provedeno pouze v daných intervalech - ne nepřetržitě, takže by neměl mít na výkon vůbec žádný dopad.

Nyní pravidelně kontrolujte poslední počet zaškrtnutí u položky „Now“ a pokud je rozdíl mezi nimi větší než doba považovaná za bezpečnou dobu nečinnosti, ořízněte paměť.

Nyní rozhodněte, po jak dlouhou dobu budete program považovat za nečinný. V mém případě jsme se rozhodli pro dvě minuty, ale v závislosti na okolnostech si můžete vybrat libovolnou dobu.

Přizpůsobit tuto metodu dlouhým časům zpracování nebo dávkovým procesům je docela jednoduché. Normálně budete mít dobrý nápad, kde začne zdlouhavý proces (např. Začátek čtení smyčky přes miliony databázových záznamů) a kde to skončí (konec smyčky čtení databáze).

Jednoduše deaktivujte časovač na začátku procesu a na konci procesu jej znovu aktivujte.