Sdílet prostřednictvím


Zvýšení výkonu aplikace snížením využití paměti a místa na disku

Tato příručka vám ukáže, jak zlepšit výkon aplikace pro Windows dvěma primárními způsoby:

Minimalizace využití paměti

Existuje řada způsobů, jak minimalizovat množství paměti, kterou vaše aplikace pro Windows používá, můžete:

  • Snížení využití paměti v popředí
  • Minimalizace práce na pozadí
  • Uvolnění prostředků, když je aplikace na pozadí
  • Ujistěte se, že aplikace nezpůsobuje únik paměti.

Aby bylo možné odpovídajícím způsobem minimalizovat využití paměti, je nejprve důležité pochopit:

Jakmile budete mít systémové trasování k analýze, doporučujeme použít analýzu trasování, abyste snížili využití paměti.

Pracovní sada, dynamická paměť a virtuální přidělení

Pracovní sada aplikace – sada stránek ve svém virtuálním adresního prostoru, který je aktuálně v paměti, je jedním z měření využití paměti aplikace.

Velikost paměti, kterou aplikace používá, má vliv na výkon modulu runtime a také rychlost odezvy systému jako celku. Minimalizace využití paměti pomůže aplikaci lépe provádět snížením nákladů na procesor spojených s přístupem k větší paměti. Nižší využití paměti také pomáhá s odezvou systému a obecně s uživatelským prostředím aplikace, protože aplikace nakonec nevytěsňuje jiný obsah paměti.

K přesunutí paměti může dojít, když se systém pokusí zachovat obsah v paměti, k němuž se nedávno přistupovalo, a v případě potřeby ořízne a odstraní z paměti dříve použitý obsah. Když uživatel přepne zpět do prostředí nebo do jiné aplikace a potřebná data nejsou v paměti, data se budou muset načíst z disku. Uživatel si pravděpodobně všimne zpomalení kvůli tomuto procesu.

Pro paměť používanou aplikací existují dvě klíčové části: 1) dynamická paměť a 2) paměť s podporou souborů. Využití paměti založené na souborech pochází z binárních souborů a datových souborů, jako jsou databáze používané aplikací. Obvykle se nejedná o významný blok využití paměti aplikace a často se jedná o konstantní hodnotu. (Výjimkou by byly aplikace pro zpracování dat, kompilace kódu atd.) Významnější zdroj využití paměti a místo, kde se projevují úniky paměti, je dynamická paměť.

Dynamická paměť odpovídá virtuální paměti přidělené aplikaci pomocí rutin přidělování paměti. Na rozdíl od paměti založené na souborech, která přetrvává napříč restartováními systému, existuje dynamická paměť pouze po celou dobu životnosti aplikace. Dynamická paměť je běžně se vyskytující významný zdroj využití paměti a kde se projevují úniky paměti.

Virtuální rutiny přidělování (VirtualAlloc) zpracovávají požadavky na přidělení paměti z aplikace systému Windows nezávisle na rutině aplikační vrstvy používané k přidělování paměti. I když není veškerá paměť přidělená aplikací po celou dobu v paměti, analýza těchto přidělení poskytuje konzistentní způsob, jak porozumět využití paměti aplikace.

Pokud chcete porozumět využití paměti vaší aplikace a najít místa pro vylepšení, doporučujeme zachytit trasování VirtualAllocation, jak je popsáno níže.

Zachycení systémového trasování za účelem analýzy využití paměti

Záznam aktivity zařízení v určitém časovém období se označuje jako trasování systému. Trasování systému vytvoří trasovací soubor, který se dá použít k vygenerování sestavy a pomůže vám zjistit, jak zlepšit výkon vaší aplikace.

Stopy se mohou lišit délkou.

  • Krátké trasování lze použít k zachycení spuštění aplikace. To může zahrnovat přechod aplikace do neaktivního stavu, kdy je minimalizované okno aplikace nebo se zavře okna aplikace, zatímco proces aplikace přetrvává.
  • Dlouhodobé trasování, obvykle trvající několik minut, je užitečné při diagnostice úniků paměti. Pokud využití paměti v průběhu času dále roste, může to obvykle naznačovat únik.

Pro monitorování využití paměti je k dispozici několik nástrojů, mezi které patří:

Pro účely tohoto článku se zaměříme na použití Analyzátoru výkonu systému Windows. Další informace o výběru nástroje pro profilaci výkonu aplikace najdete v tématu Výběr mezi profilerem výkonu sady Visual Studio, sadou Windows Performance Toolkit a PerfView.

Zachycení stopy:

  1. Otevřete příkazový řádek (PowerShell nebo příkazový řádek) v režimu správce. (Pokud neběží v režimu správce, může se zobrazit kód chyby: 0xc5585011, nepovedlo se povolit zásadu profilování výkonu systému.)

  2. Zadejte příkaz: wpr -start VirtualAllocation -filemode

  3. Spusťte scénář, který prošetřujete. (Například spuštění aplikace.)

  4. Zadejte příkaz: wpr -stop Trace.etl

Analýza trasování systému

Abyste zjistili, které funkce vaší aplikace přidělily paměť, kterou byste mohli snížit, budete teď muset analyzovat trasování systému, které bylo zachyceno. Abych analyzoval trasování:

  1. Otevřete trasování pomocí Analyzátoru výkonu systému Windows zadáním příkazu: wpa.exe Trace.etl

  2. V okně Průzkumníka grafů rozbalte oddíl Paměť , klikněte pravým tlačítkem na graf Celkového potvrzení a vyberte Přidat graf do nového zobrazení analýzy.

  3. Otevřete Editor zobrazení kliknutím na ozubené kolo Nastavení a výběrem následujícího uspořádání sloupců: Proces, Typ potvrzení, Zásobník potvrzení a Velikost.

  4. Klikněte na záhlaví sloupce Velikost , aby se výsledky seřadily sestupně. Zásobník potvrzení zobrazuje cestu kódu, která vede k přidělení paměti. Tyto výsledky vám můžou pomoct pochopit důvod přidělení. Řazení podle velikosti umožňuje zaměřit se na větší přidělení a prozkoumat, jestli existuje příležitost k optimalizaci.

  5. Vyfiltrujte procesy, které vás zajímají, a to tak, že kliknete pravým tlačítkem na proces a vyberete Filtr na výběr.

  6. Pokud chcete přiblížit vybranou oblast v zobrazení, označte rozsah, klikněte pravým tlačítkem myši na graf a vyberte Lupa.

  7. Procházejte zásobníkem Commit Stack, abyste pochopili, které funkce alokovaly paměť. Zásobníky commit budou potřebovat načtené symboly. Pokud chcete načíst symboly, vyberte v horním navigačním řádku trasování>načíst symboly.

    Snímek obrazovky trasování paměti Analyzátoru výkonu Windows

Použití analýzy trasování za účelem snížení využití paměti

Při analýze přidělené paměti najdete vodítka, která vám pomůžou rozhodnout, kde je možné minimalizovat využití paměti.

Několik oblastí, které byste měli zvážit v souvislosti s použitím analýzy trasování směrem k aktualizaci kódu za účelem snížení využití paměti, patří:

  • Snížení využití paměti v popředí: Analýza trasování paměti vám může pomoct identifikovat případné nepotřebné využití paměti v popředí a aktualizovat kód tak, aby se toto využití snížilo nebo odebralo.

  • Minimalizace práce na pozadí: Systém má zásady, které vyřazují stránky z pracovních sad procesů. Použití menší paměti na pozadí umožňuje systému být efektivnější tím, že zachovává méně paměti aplikace v paměti. Přečtěte si další informace o tom, jak zlepšit spotřebu energie a výdrž baterie tím, že minimalizujete práci na pozadí, což se také projeví při použití menšího využití paměti na pozadí.

  • Uvolnění prostředků na pozadí: Za běhu může aplikace vytvořit nějaké mezipaměti paměti a také vytvořit alokace grafiky pro podporu svého uživatelského rozhraní. Tyto přidělení můžou být možné uvolnit, pokud je aplikace minimalizovaná nebo není viditelná. Aplikace se může zaregistrovat k oznámením o nedostatku paměti, aby mohla provést příslušnou akci, ale lepší strategií může být uvolnit paměť po uplynutí doby nečinnosti, kdy aplikace usoudí, že je neaktivní. Toto období disuse se může lišit podle aplikace, takže možné indikátory neaktivního použití mohou být v rozsahu od několika minut po 1/2 hodiny nebo více. Je třeba věnovat pozornost vyvážení tohoto druhu úspor paměti s odezvou. Pokud je opětovné sestavení mezipaměti nákladné, může se aplikace rozhodnout, že ji po celou dobu životnosti aplikace zachová.

  • Zajistěte, aby vaše aplikace neunikala paměť: Chcete-li zkontrolovat unikání paměti, nejprve vytvořte referenční test stabilního stavu, kde se využití paměti aplikace ustálí nebo neroste nad určitou hodnotu. Tento stabilní stav můžete vytvořit nepřetržitě pomocí aplikace nebo ji nechat nečinnou na pozadí. Pomocí trasování, které jste zachytili k identifikaci možného úniku paměti, můžete zjistit, kde se tato paměť přiděluje ve vašem kódu a jak ji lze uvolnit poté, co splní svůj účel. Pokud aplikace běží a paměť se nadále zvětšuje, pravděpodobně to naznačuje únik paměti. Přibližte sekci odpovídající růstu v rámci vašeho trasování a pečlivě analyzujte zásobníky commitů.

Efektivní využití místa na disku

Nároky na disk odkazují na velikost aplikace, když je uložená v neaktivním stavu (nespouštějící kód). Pokud aplikace zabírá velké nároky na disk, může být příležitostí k optimalizaci.

Existuje několik způsobů, jak snížit nároky na disky vaší aplikace, což může zvýšit výkon:

  • Jakmile se disk zaplní, systém souborů už nemůže ukládat nový obsah souvislým způsobem. Celý disk se fragmentuje a uloží nový obsah do nesouvislých sektorů. To znamená delší dobu latence, kdy se k tomuto obsahu přistupuje z disku. Vstupně-výstupní systémy poskytují mnohem lepší propustnost disku, pokud je obsah souvislý a lze k němu přistupovat sekvenčně nebo pomocí větších I/O operací.

  • Úplný disk může vést k delší době zápisu pro systémy založené na SSD. Když je méně prázdných buněk k absorpci zápisů, může zápis vyžadovat operaci čtení-změna-zápis, což zpomaluje výkon.

  • Plný disk může bránit možnosti aktualizovat aplikaci. I když je operační systém odolný a dokáže udržovat systém v aktualizovaném a zabezpečeném stavu, a to i v případě nedostatku volného místa na disku, množství volného místa na disku pro přípravu obsahu aktualizace aplikace se přeloží na rychlejší a plynulejší prostředí aktualizací.

  • Požadování přístupu k velkému objemu diskového prostoru za běhu se také promítne do využití paměti. To bude mít vliv na rychlost odezvy aplikace a systému obecně. Kromě toho, pokud je při běhu aplikace vyžadován pouze malý podíl prostoru na disku, může aplikace využívat místo na disku neefektivně.

Několik způsobů, jak snížit nebo zefektivnit místo na disku, patří:

  • Použití principů "pay-for-play" na diskový prostor (stáhněte pouze to, co potřebujete): Aplikace může zahrnovat širokou škálu funkcí, které se nevztahují na všechny uživatele. To může být jedním z důvodů velkého objemu na disku. Když aplikujete principy "pay-for-play", můžete uživatele požádat, aby si stáhli pouze funkce, které potřebují, což vede k menším nárokům na disk, když si stáhnou vaši aplikaci. Další obsah je volitelný ke stažení jenom v případě, že uživatel potřebuje bohatší možnosti. Kromě funkcí můžete na podporu jazyků použít stejné principy "pay-for-play". Aplikace může ve výchozím nastavení obsahovat podmnožinu oblíbených jazykových voleb s dalšími jazyky, které jsou volitelně zahrnuté nebo závislé na umístění nastaveném v systému uživatele.

  • Použití efektivní velikosti mezipaměti: V některých případech může aplikace používat mezipaměti na disku, aby uživatelské prostředí rychleji reagovalo. Zásady se dají nastavit tak, jak vaše aplikace spravuje mezipaměť, s horním limitem nastaveným na velikost mezipaměti na základě kapacity disku a změnou velikosti mezipaměti v případě nízkého místa na disku.

  • Efektivní využití prostředků: Aplikace často obsahuje grafické prvky a může se skládat z různých velikostí obrázků pro podporu více rozlišení. Optimalizace velikosti obrázku, rozměrů, formátu a komprese pro podmnožinu rozlišení a využití škálování pro podporu zbývajících rozlišení může výrazně snížit nároky na disk.

  • Prozkoumejte příležitosti binární optimalizace: Nástroje, jako je SizeBench, umožňují autorům aplikací prozkoumat, co přispívá k binární stopě, a najít příležitosti ke snížení využitého místa na disku.

Dodatečné zdroje