Condividi tramite


Migliorare le prestazioni dell'app riducendo l'uso di memoria e spazio su disco

Questa guida illustra come migliorare le prestazioni dell'applicazione Windows in due modi principali:

Ridurrre al minimo l'utilizzo della memoria

Esistono diversi modi per ridurre al minimo la quantità di memoria usata dall'app di Windows. È possibile:

  • Ridurre l'utilizzo della memoria in primo piano
  • Ridurre al minimo il lavoro in background
  • Rilasciare le risorse in background
  • Assicurarsi che l'applicazione non perda memoria

Per ridurre al minimo in modo appropriato l'utilizzo della memoria, è prima importante comprendere quanto segue:

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.

Working set, 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 è di ausilio in relazione alla velocità di risposta del sistema e all'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 è avuto accesso di recente e, se necessario, taglia ed esegue il page-out del 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 si manifestano le 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 usare una traccia a breve esecuzione per acquisire l'avvio di un'applicazione. Ciò può includere la transizione dell'app allo stato inattivo, in cui la finestra dell'applicazione viene ridotta a icona o le finestre dell'applicazione vengono chiuse mentre il processo dell'applicazione persiste.
  • Una traccia a esecuzione prolungata, in genere diversi minuti di durata, è utile per diagnosticare le perdite di memoria. Se l'utilizzo della memoria continua ad avere un trend verso l'alto nel corso del tempo, questo è in genere indicativo 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:

  1. Aprire una riga di comando (PowerShell o prompt dei comandi) in modalità amministratore. (Se l'esecuzione non avviene in modalità amministratore, è possibile che venga visualizzato il codice di errore: 0xc5585011 "Non è stato possibile abilitare il criterio per profilare le prestazioni del sistema".)

  2. Immettere il comando: wpr -start VirtualAllocation -filemode

  3. Eseguire lo scenario che si sta esaminando. (Ad esempio, l'avvio dell'applicazione.)

  4. 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:

  1. Aprire la traccia usando Windows Performance Analyzer, immettendo il comando:wpa.exe Trace.etl

  2. Nella finestra Graph Explorer, espandere la sezione Memoria, fare clic con il tasto destro sul grafico Commit totale e selezionare Aggiungi grafico alla nuova visualizzazione analisi.

  3. Aprire Editor visualizzazione facendo clic sul pulsante a forma di ingranaggio Impostazioni e selezionando la seguente disposizione di colonne: Processo, Tipo di Commit, Stack Commit e Dimensioni.

  4. Fare clic sull'intestazione di colonna Dimensioni in modo che i risultati vengano ordinati in ordine decrescente. Lo Stack Commit 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.

  5. Filtrare in base al processo (ai processi) che si è interessati ad analizzare facendo clic con il pulsante destro del mouse sul processo e scegliendo Filtra in selezione.

  6. Per ingrandire l'area di interesse nel riquadro di visualizzazione, selezionare un intervallo, fare clic con il pulsante destro del mouse sul grafico e selezionare Zoom.

  7. Esplorare lo stack di commit per comprendere quali funzioni presentano memoria allocata. Gli stack di commit avranno bisogno di simboli caricati. Per caricare i simboli, selezionare Traccia>Carica simboli dalla barra del menu di navigazione superiore.

    Screenshot della traccia della memoria di Windows analizzatore prestazioni

Applicazione dell'analisi della 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 della 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.

  • Riduzione al minimo del lavoro in background: il sistema dispone di criteri per escludere le pagine dai set di lavoro del processo. L'utilizzo 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 in un minor 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. Tali allocazioni possono essere liberate quando l'applicazione è ridotta a icona o non è visibile. Un'applicazione può registrarsi per le notifiche relative alla 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 mancato uso può variare in base all'applicazione, quindi i possibili indicatori di uso inattivo possono variare da pochi minuti a 1/2 ora 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. Utilizzando 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 è servita per 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. Eseguire lo zoom avanti sull'area corrispondente alla crescita all'interno della traccia e analizzare 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 (con la mancata esecuzione del codice). Se l'applicazione occupa molto footprint su disco, può essere un'opportunità per ottimizzare.

Esistono diversi modi per ridurre il footprint del disco dell'app per migliorare le prestazioni:

  • Quando un disco diventa 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 footprint su disco a cui accedere in fase di esecuzione si tradurrà anche nell'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 in relazione allo spazio su disco includono:

  • Applicare i principi di "pagamento in base al consumo" al footprint del disco (scaricare solo ciò di cui si ha bisogno): un'applicazione può includere un'ampia gamma di funzionalità con non tutte le funzionalità applicabili a tutti gli utenti. Questo può rappresentare un motivo alla base di un footprint su disco di grandi dimensioni. Applicando i principi di "pagamento in base al consumo", è possibile chiedere agli utenti di selezionare di scaricare solo le funzionalità necessarie, il che si traduce in un footprint del disco più piccolo quando si scarica 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.

Risorse aggiuntive