Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här guiden visar hur du kan förbättra prestandan för ditt Windows-program på två huvudsakliga sätt:
Minimera minnesanvändning
Det finns en mängd olika sätt att minimera mängden minne som din Windows-app använder. Du kan:
- Minska förgrundsminnesanvändningen
- Minimera bakgrundsarbete
- Frigöra resurser i bakgrunden
- Kontrollera att programmet inte läcker minne
För att minimera minnesanvändningen på lämpligt sätt är det först viktigt att förstå:
- hur minne används och allokeras, med hjälp av arbetsuppsättningen, dynamiskt minne och virtuell allokering,
- hur man fångar en systemspårning och
- hur du analyserar systemspårningen.
När du har en systemspårning att analysera rekommenderar vi vägledning för att använda spårningsanalysen för att minska minnesanvändningen.
Arbetsuppsättning, dynamiskt minne och virtuell allokering
Arbetsuppsättningen för ett program – uppsättningen sidor i dess virtuella adressutrymme som för närvarande finns i minnet – är ett mått på appens minnesanvändning.
Mängden minne som ett program använder påverkar dess körningsprestanda samt systemets svarstider som helhet. Om du minimerar minnesanvändningen kan appen prestera bättre genom att minska cpu-kostnaderna för åtkomst till mer minne. Lägre minnesanvändning hjälper också till med systemets svarstider, och appanvändarens upplevelse i allmänhet, eftersom programmet inte tränger undan annat minnesinnehåll.
Minnesförskjutning kan inträffa eftersom systemet försöker behålla minnesinternt innehåll som nyligen använts och vid behov trimmar och rensar ut innehåll som användes tidigare. När användaren växlar tillbaka till gränssnittet eller ett annat program och nödvändiga data inte finns i minnet måste data läsas från disken. Användaren kommer sannolikt att märka en avmattning på grund av den här processen.
Det finns två viktiga delar i minnet som används av ett program: 1) dynamiskt minne och 2) filbackat minne. Filbaserad minnesanvändning kommer från binärfiler och datafiler, till exempel databaser, som används av ett program. Detta är vanligtvis inte en betydande del av ett programs minnesanvändning och ofta en konstant. (Undantag skulle vara databehandlingsprogram, kodkompilering osv.) Den mer betydande minneskällan och där läckagemanifestet är dynamiskt minne.
Dynamiskt minne motsvarar virtuellt minne som allokeras av ett program med hjälp av rutiner för minnesallokering. Till skillnad från filbackat minne, som bevaras mellan systemomstarter, finns dynamiskt minne bara under programmets livslängd. Dynamisk minnesallokering är en betydande källa till minnesanvändning och där minnesläckor uppstår.
Virtuella allokeringsrutiner (VirtualAlloc) hanterar minnesallokeringsbegäranden från ett Windows-program oberoende av den programnivårutin som används för minnesallokering. Även om inte allt minne som allokeras av ett program kan finnas i minnet hela tiden, ger analys av sådana allokeringar ett konsekvent sätt att förstå minnesanvändningen för ett program.
För att förstå programmets minnesanvändning och hitta platser där du kan göra förbättringar rekommenderar vi att du samlar in en VirtualAllocation-spårning enligt beskrivningen nedan.
Samla in en systemspårning för att analysera minnesanvändning
Registrering av enhetsaktivitet under en tidsperiod kallas systemspårning. Systemspårning skapar en spårningsfil som kan användas för att generera en rapport och som hjälper dig att identifiera hur du kan förbättra appens prestanda.
Spårningar kan variera i längd:
- En kort körspårning kan användas för att registrera uppstarten av ett program. Detta kan inkludera appens övergång till det inaktiva tillståndet, där programfönstret minimeras eller programfönstren stängs medan programprocessen kvarstår.
- En långvarig spårning, vanligtvis flera minuter, är användbar för att diagnostisera minnesläckor. Om minnesanvändningen fortsätter att öka med tiden är detta vanligtvis en läcka.
Det finns flera tillgängliga verktyg för övervakning av minnesanvändning, bland annat:
I den här artikeln fokuserar vi på att använda Windows Performance Analyzer. Mer information om hur du väljer ett verktyg för att profilera programmets prestanda finns i Välja bland Visual Studio Performance Profiler, Windows Performance Toolkit och PerfView.
Så här registrerar du en spårning:
Öppna en kommandorad (PowerShell eller kommandotolken) i administratörsläge. (Om du inte kör i administratörsläge kan du få felkod: 0xc5585011, "Det gick inte att aktivera principen för att profilera systemprestanda.")
Ange kommandot:
wpr -start VirtualAllocation -filemodeKör det scenario som du undersöker. (Starta ditt program, till exempel.)
Ange kommandot:
wpr -stop Trace.etl
Analysera systemspårningen
För att hitta vilken av appens funktioner som har allokerat minne som du kanske kan minska, måste du nu analysera systemspårningen som har avbildats. Så här analyserar du spårningen:
Öppna spårningen i Windows Performance Analyzer genom att ange kommandot:
wpa.exe Trace.etlI fönstret Graph Explorer kan du utöka avsnittet Minne, högerklicka på grafen Total åtagande och välj Lägg till graf i ny analysvy.
Öppna Visningsredigeraren genom att klicka på kugghjulet Inställningar och välja följande kolumnarrangemang: Process, Incheckningstyp, Incheckningsstack och Storlek.
Klicka på kolumnrubriken Storlek så att resultatet sorteras i fallande ordning. Commit Stack visar den kodsökväg som leder till att minne allokeras. Dessa resultat kan hjälpa dig att förstå orsaken till allokeringen. Genom att sortera efter storlek kan du fokusera på de större allokeringarna och undersöka om det finns en möjlighet att optimera.
Filtrera efter de processer som du är intresserad av att analysera genom att högerklicka på processen och välja Filtrera till markering.
Om du vill zooma in till din intresseregion i visningsområdet väljer du ett intervall, högerklickar på diagrammet och väljer Zooma.
Navigera genom Commit Stack för att förstå vilka funktioner som har allokerat minne. Incheckningsstackar behöver symboler som läses in. Om du vill läsa in symboler väljer du Trace>Load-symboler i det övre navigeringsmenyfältet.
Använda spårningsanalysen för att minska minnesanvändningen
När du analyserar det allokerade minnet hittar du ledtrådar som hjälper dig att avgöra var minnesanvändningen kan minimeras.
Några områden att tänka på när det gäller att tillämpa spårningsanalysen på att uppdatera koden för att minska minnesanvändningen är:
Minska minnesanvändningen i förgrunden: Genom att analysera minnesspårningen kan det hjälpa dig att identifiera eventuell onödig minnesanvändning i förgrunden och uppdatera koden för att minska eller ta bort användningen.
Minimera arbete i bakgrunden: Systemet har principer för att åldra ut sidor från processarbetsuppsättningarna. Att använda mindre minne i bakgrundsprocesserna gör att systemet kan vara mer effektivt genom att minska programmets minnesanvändning. Läs mer om hur du förbättrar strömförbrukningen och batteritiden genom att minimera bakgrundsarbete, vilket också innebär mindre minnesanvändning i bakgrunden.
Frigöra resurser i bakgrunden: Under körning kan ett program skapa vissa minnescacher samt göra grafikresurstilldelningar för att stödja användargränssnittet. Dessa allokeringar kan frigöras när programmet minimeras eller inte visas. Ett program kan registrera sig för meddelanden med lågt minne för att vidta sådana åtgärder, men en bättre strategi kan vara att frigöra minne efter en period av att inte användas, när programmet drar slutsatsen att det är inaktivt. Den här perioden av avaktivering kan variera beroende på program, så möjliga indikatorer för inaktiv användning kan variera från en handfull minuter till en 1/2 timme eller mer. Var noga med att balansera den här typen av minnesbesparingar med svarstider. Om en cache är dyr att återskapa kan programmet välja att behålla den under programmets livslängd.
Kontrollera att ditt program inte läcker minne: För att söka efter minnesläckor bör du först upprätta en referenspunkt för ett stabilt tillstånd där minnesanvändningen når en platå eller inte ökar över ett visst värde. Du kan upprätta det här stadiga tillståndet genom att kontinuerligt använda programmet eller lämna det inaktivt i bakgrunden. Med hjälp av spårningen som du har samlat in för att identifiera en möjlig minnesläcka kan du hitta var det minnet allokeras i koden och hur det kan frigöras från användning när det har tjänat sitt syfte. Om minnet fortsätter att växa när programmet körs är detta en sannolik indikation på en minnesläcka. Zooma in i den region som motsvarar tillväxten i spårningen och analysera noggrant incheckningsstackarna.
Använd diskutrymme effektivt
Diskfotavtryck refererar till storleken på ett program när det lagras i ett inaktivt tillstånd (inte kör kod). Om programmet tar upp mycket diskfotavtryck kan det vara en möjlighet att optimera.
Det finns flera sätt att minska appens diskfotavtryck för att förbättra prestandan:
När en disk blir full kan filsystemet inte längre lagra nytt innehåll på ett sammanhängande sätt. En fullständig disk blir fragmenterad och lagrar nytt innehåll i icke-sammanhängande sektorer. Detta innebär längre svarstid när innehållet nås från disken. I/O-system ger mycket bättre diskdataflöde när innehållet är sammanhängande och kan nås sekventiellt eller med större IO:er.
En fullständig disk kan översättas till längre skrivfördröjningar för SSD-baserade system. När det finns färre tomma celler att absorbera skrivningar kan en skrivning medföra en läs-ändra-skrivåtgärd, vilket minskar prestandan.
En fullständig disk kan hindra möjligheten att uppdatera programmet. Operativsystemet är motståndskraftigt och kan hålla systemet uppdaterat och säkert, även med lågt tillgängligt diskutrymme, men en hälsosam mängd ledigt diskutrymme för mellanlagring av innehållet för din appuppdatering leder till en snabbare och smidigare uppdateringsupplevelse.
Att behöva en stor mängd diskutrymme som ska åtkommas vid körning kommer också att förvandlas till minnesförbrukning. Detta påverkar svarstiden för ditt program och systemet i allmänhet. Dessutom, om det endast krävs en liten del av diskutrymmet vid körning, kan programmet använda diskutrymmet ineffektivt.
Några sätt att minska eller vara mer effektiv med diskutrymmet är:
Tillämpa principerna "betala för spel" på ditt diskfotavtryck (ladda bara ned det du behöver): Ett program kan innehålla ett brett utbud av funktioner där inte alla funktioner gäller för alla användare. Detta kan vara en orsak till ett stort diskavtryck. Genom att tillämpa principerna "betala för spel" kan du be användarna att bara välja att ladda ned de funktioner som de behöver, vilket översätter till ett mindre diskfotavtryck när de laddar ned din app. Ytterligare innehåll är endast valfritt för nedladdning när användaren har behov av mer omfattande funktioner. Förutom funktioner kan du använda samma "pay-for-play"-principer för språkstöd. Programmet kan innehålla en delmängd av populära språkval som standard, med ytterligare språk som eventuellt ingår eller är beroende av den plats som anges i användarens system.
Använd effektiv cachestorlek: I vissa fall kan ett program använda diskcacheminnen för att göra användarupplevelsen mer dynamisk. Principer kan anges för hur ditt program hanterar cachen, med en övre gräns inställd på cachestorleken baserat på diskkapacitet och storleksändring av cachen när det finns lite ledigt utrymme på disken.
Tillämpa effektiv användning av tillgångar: Ett program innehåller ofta bildtillgångar och kan bestå av en mängd bildstorlekar som stöder flera upplösningar. Om du optimerar bildstorlek, dimensioner, format och komprimering för en delmängd av upplösningar och använder skalning för att stödja återstående upplösningar kan diskavtrycket minska avsevärt.
Undersöka möjligheter till binär optimering: Verktyg, till exempel SizeBench, gör det möjligt för programförfattare att undersöka vad som bidrar till det binära fotavtrycket och hitta möjligheter att minska mängden diskutrymme som används.
Ytterligare resurser
Windows developer