Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa guida illustra come migliorare le prestazioni dell'applicazione Windows in due modi principali:
Ridurre al minimo l'utilizzo della memoria
Esistono diversi modi per ridurre al minimo la quantità di memoria usata dall'app di Windows, puoi:
- Ridurre l'utilizzo della memoria in primo piano
- Ridurre al minimo il lavoro in background
- Rilascia le risorse quando si è in background
- Assicurarsi che l'applicazione non perde memoria
Per ridurre al minimo in modo appropriato l'utilizzo della memoria, è prima importante comprendere:
- come viene usata e allocata la memoria, usando il working set, la memoria dinamica e l'allocazione virtuale,
- come acquisire una traccia di sistema e
- come analizzare la traccia di sistema.
Dopo aver ottenuto una traccia di sistema da analizzare, è consigliabile fornire indicazioni per l'applicazione dell'analisi di traccia per ridurre l'utilizzo della memoria.
Insieme di lavoro, memoria dinamica e allocazione virtuale
Il working set di un'applicazione, ovvero il set di pagine nello spazio indirizzi virtuale che attualmente risiede in memoria, è una misura dell'utilizzo della memoria dell'app.
La quantità di memoria usata da un'applicazione influisce sulle prestazioni di runtime, nonché sulla velocità di risposta del sistema nel suo complesso. Ridurre al minimo l'uso della memoria consentirà all'app di ottenere prestazioni migliori riducendo i costi della CPU associati all'accesso a una quantità maggiore di memoria. Un utilizzo inferiore della memoria consente anche la velocità di risposta del sistema e l'esperienza dell'utente dell'app in generale, in quanto l'applicazione non comporta lo spostamento di altri contenuti di memoria.
Lo spostamento della memoria può verificarsi quando il sistema tenta di conservare il contenuto in memoria a cui si è acceduto di recente e, se necessario, taglia e trasferisce nella memoria di swap il contenuto usato in precedenza. Quando l'utente torna alla shell o a un'altra applicazione e i dati necessari non risiedono in memoria, i dati dovranno essere letti dal disco. L'utente noterà probabilmente un rallentamento a causa di questo processo.
Esistono due parti chiave per la memoria usata da un'applicazione: 1) memoria dinamica e 2) memoria supportata da file. L'utilizzo della memoria supportata da file proviene da file binari e file di dati, ad esempio i database, usati da un'applicazione. Questo non è in genere un blocco significativo dell'utilizzo della memoria di un'applicazione e spesso una costante. (Le eccezioni sono applicazioni di elaborazione dati, compilazione del codice e così via) L'origine più significativa dell'utilizzo della memoria e la posizione in cui il manifesto delle perdite è la memoria dinamica.
La memoria dinamica corrisponde alla memoria virtuale allocata da un'applicazione usando routine di allocazione della memoria. A differenza della memoria supportata da file, che persiste tra i riavvii del sistema, la memoria dinamica esiste solo per la durata dell'applicazione. La memoria dinamica è una fonte comunemente significativa di utilizzo della memoria e in cui si manifestano perdite di memoria.
Le routine di allocazione virtuale (VirtualAlloc) gestiscono le richieste di allocazione della memoria da un'applicazione Windows indipendentemente dalla routine a livello di applicazione usata per l'allocazione di memoria. Anche se non tutta la memoria allocata da un'applicazione può risiedere in memoria per tutto il tempo, l'analisi di tali allocazioni offre un modo coerente per comprendere l'utilizzo della memoria di un'applicazione.
Per comprendere l'utilizzo della memoria dell'applicazione e individuare i punti in cui apportare miglioramenti, è consigliabile acquisire una traccia VirtualAllocation come descritto di seguito.
Acquisire una traccia di sistema per analizzare l'utilizzo della memoria
La registrazione dell'attività del dispositivo in un periodo di tempo è nota come traccia di sistema. La traccia di sistema produce un file di traccia che può essere usato per generare un report e identificare come migliorare le prestazioni dell'app.
Le tracce possono variare in lunghezza:
- È possibile utilizzare una traccia breve per acquisire il processo di avvio di un'applicazione. Ciò può includere la transizione dell'applicazione allo stato inattivo, in cui la finestra dell'app viene ridotta a icona o le finestre dell'app vengono chiuse mentre il processo dell'applicazione persiste.
- Una traccia di lunga durata, tipicamente della durata di diversi minuti, è utile per diagnosticare le perdite di memoria. Se l'utilizzo della memoria continua ad aumentare nel corso del tempo, questo è indicativo in genere di una perdita.
Sono disponibili più strumenti per il monitoraggio dell'uso della memoria, tra cui:
Ai fini di questo articolo, ci concentreremo sull'uso di Windows Performance Analyzer. Per altre informazioni sulla scelta di uno strumento per la profilatura delle prestazioni dell'applicazione, vedere Scelta tra Visual Studio Performance Profiler, Windows Performance Toolkit e PerfView.
Per acquisire una traccia:
Apri una riga di comando (PowerShell o Prompt dei Comandi) in modalità amministratore. Se non viene eseguito in modalità amministratore, è possibile che venga visualizzato il codice di errore: 0xc5585011 "Non è stato possibile abilitare il criterio per profilare le prestazioni del sistema".
Immettere il comando :
wpr -start VirtualAllocation -filemodeEsegui lo scenario che stai esaminando. Ad esempio, l'avvio dell'applicazione.
Immettere il comando :
wpr -stop Trace.etl
Analizzare la traccia di sistema
Per trovare quale delle funzioni dell'app ha allocato memoria che potrebbe essere possibile ridurre, è ora necessario analizzare la traccia di sistema acquisita. Per analizzare la traccia:
Aprire la traccia usando Windows Performance Analyzer immettendo il comando :
wpa.exe Trace.etlNella finestra Graph Explorer, espandere la sezione Memoria, fare clic con il pulsante destro del mouse sul grafico Commit totale e selezionare Aggiungi grafico alla nuova visualizzazione di analisi.
Aprire l'editor di visualizzazione facendo clic sull'ingranaggio Impostazioni e selezionando la disposizione delle colonne seguente: Processo, Tipo di commit, Stack di commit e dimensioni.
Fare clic sull'intestazione di colonna Dimensioni in modo che i risultati vengano ordinati in ordine decrescente. Lo Commit Stack mostra il percorso del codice che porta all'allocazione della memoria. Questi risultati possono essere utili per comprendere il motivo dell'allocazione. L'ordinamento in base alle dimensioni consente di concentrarsi sulle allocazioni più grandi e verificare se è possibile ottimizzare.
Filtrare in base al processo (es) che si è interessati ad analizzare facendo clic con il pulsante destro del mouse sul processo e scegliendo Filtra in selezione.
Per ingrandire l'area di interesse nel riquadro di visualizzazione, selezionare un intervallo, fare clic con il pulsante destro del mouse sul grafico e scegliere Zoom.
Esplorare lo stack di commit per comprendere quali funzioni hanno allocato memoria. Gli stack di commit avranno bisogno di simboli caricati. Per caricare i simboli, selezionare Trace>Carica simboli dalla barra dei menu di navigazione in alto.
Applicazione dell'analisi di traccia per ridurre l'utilizzo della memoria
Nell'analisi della memoria allocata sono disponibili indizi utili per decidere dove ridurre al minimo l'utilizzo della memoria.
Alcune aree da considerare per quanto riguarda l'applicazione dell'analisi di traccia all'aggiornamento del codice per ridurre l'utilizzo della memoria, tra cui:
Ridurre l'utilizzo della memoria in primo piano: l'analisi della traccia della memoria può aiutare a identificare qualsiasi utilizzo di memoria non necessario in primo piano e aggiornare il codice per ridurre o rimuovere tale utilizzo.
Ottimizzazione del lavoro in background: il sistema ha politiche per rimuovere gradualmente le pagine dagli insiemi di lavoro del processo. L'uso di meno memoria in background consente al sistema di essere più efficiente mantenendo meno della memoria dell'applicazione residente. Altre informazioni su come migliorare il consumo di energia e la durata della batteria riducendo al minimo il lavoro in background, che si tradurrà anche nell'uso di meno utilizzo della memoria in background.
Rilasciare le risorse in background: in fase di esecuzione, un'applicazione può creare alcune cache di memoria e creare allocazioni grafiche per supportare l'interfaccia utente. Queste allocazioni possono essere liberate quando l'applicazione è ridotta a icona o non è visibile. Un'applicazione può registrarsi per le notifiche a memoria insufficiente per eseguire tale azione, ma una strategia migliore potrebbe essere liberare memoria dopo un periodo di non utilizzo, quando l'applicazione conclude che è inattiva. Questo periodo di disuso può variare in base all'applicazione, quindi i possibili indicatori di uso inattivo possono variare da pochi minuti a 1/2 ore o più. Occorre prestare attenzione per bilanciare questo tipo di risparmio di memoria con velocità di risposta. Se una cache è costosa da ricompilare, l'applicazione può scegliere di conservarla per tutta la durata dell'applicazione.
Assicurarsi che l'applicazione non perda memoria: per verificare la presenza di perdite di memoria, stabilire prima un benchmark di stato stabile, in cui l'utilizzo della memoria dell'applicazione si stabilizza o non aumenta oltre un determinato valore. È possibile stabilire questo stato stabile usando continuamente l'applicazione o lasciandola inattiva in background. Usando la traccia acquisita per identificare una possibile perdita di memoria, è possibile trovare la posizione in cui la memoria viene allocata nel codice e come può essere liberata dall'uso dopo che ha servito il suo scopo. Se la memoria continua a crescere man mano che l'applicazione è in esecuzione, si tratta di una probabile indicazione di una perdita di memoria. Ingrandisci l'area corrispondente alla crescita della traccia e analizza attentamente gli stack di commit.
Usare in modo efficiente lo spazio su disco
Il footprint del disco si riferisce alle dimensioni di un'applicazione quando viene archiviato in uno stato inattivo (non eseguendo il codice). Se l'applicazione occupa molto spazio su disco, si presenta un'opportunità di ottimizzazione.
Esistono diversi modi per ridurre il footprint del disco dell'app per migliorare le prestazioni:
Quando un disco viene pieno, il file system non può più archiviare nuovi contenuti in modo contiguo. Un disco completo viene frammentato, archiviando nuovi contenuti in settori non contigui. Ciò si traduce in tempi di latenza più lunghi quando si accede al contenuto dal disco. I sistemi di I/O offrono una velocità effettiva del disco molto migliore quando il contenuto è contiguo e può essere accessibile in sequenza o usando operazioni di I/O di dimensioni maggiori.
Un disco completo può tradursi in latenze di scrittura più lunghe per i sistemi basati su SSD. Quando sono presenti meno celle vuote per assorbire le scritture, una scrittura può comportare un'operazione di lettura-modifica/scrittura, rallentando le prestazioni.
Un disco completo può ostacolare la possibilità di aggiornare l'applicazione. Anche se il sistema operativo è resiliente e in grado di mantenere il sistema aggiornato e sicuro, anche con spazio su disco disponibile insufficiente, una quantità integra di spazio su disco disponibile per lo staging del contenuto per l'aggiornamento dell'app si tradurrà in un'esperienza di aggiornamento più veloce e fluida.
La richiesta di una notevole quantità di spazio su disco accessibile durante l'esecuzione comporterà anche l'uso della memoria. Ciò influirà sulla velocità di risposta dell'applicazione e sul sistema in generale. Inoltre, se in fase di esecuzione è necessaria una piccola percentuale del footprint del disco, l'applicazione potrebbe usare spazio su disco in modo inefficiente.
Alcuni modi per ridurre o essere più efficienti con lo spazio su disco includono:
Applicare i principi di "pagamento in base al consumo" al footprint del disco (scarica solo ciò di cui hai bisogno): un'applicazione può includere un'ampia gamma di funzionalità con non tutte le funzionalità applicabili a tutti gli utenti. Questo può essere un motivo per cui si ha una grande impronta su disco. Applicando i principi di "pagamento in base al consumo", è possibile chiedere agli utenti di selezionare solo per scaricare le funzionalità necessarie, traducendo in un footprint del disco più piccolo quando scaricano l'app. Il contenuto aggiuntivo è reso facoltativo per il download solo quando l'utente ha bisogno di funzionalità più avanzate. Oltre alle funzionalità, è possibile applicare gli stessi principi di "pagamento in base al gioco" al supporto linguistico. L'applicazione può includere un subset di scelte linguistiche comuni per impostazione predefinita, con lingue aggiuntive facoltativamente incluse o dipendenti dal percorso impostato nel sistema dell'utente.
Applicare dimensioni della cache efficienti: in alcuni casi, un'applicazione può usare cache su disco per rendere l'esperienza utente più reattiva. I criteri possono essere impostati per il modo in cui l'applicazione gestisce la cache, con un limite massimo impostato sulle dimensioni della cache in base alla capacità del disco e al ridimensionamento della cache quando lo spazio disponibile sul disco è basso.
Applicare un uso efficiente degli asset: un'applicazione include spesso asset di immagine e può essere costituita da una gamma di dimensioni dell'immagine per supportare più risoluzioni. L'ottimizzazione delle dimensioni, delle dimensioni, del formato e della compressione delle immagini per un subset di risoluzioni e l'uso del ridimensionamento per supportare le risoluzioni rimanenti, può ridurre significativamente il footprint del disco.
Esaminare le opportunità di ottimizzazione binaria: gli strumenti, ad esempio SizeBench, consentono agli autori di applicazioni di analizzare ciò che contribuisce al footprint binario e di trovare opportunità per ridurre la quantità di spazio su disco usato.