Analizza l'efficienza della memoria

Le caratteristiche di utilizzo della memoria di un'app sono un aspetto fondamentale delle sue prestazioni. Puoi utilizzare il System Profiler per analizzare queste caratteristiche esaminando le informazioni disponibili sui contatori delle GPU.

Dispositivi Adreno

Sui dispositivi Adreno, inizia evidenziando un periodo di tempo coerente con un singolo frame GPU, come descritto nell'articolo Stimare i tempi di elaborazione dei frame di CPU e GPU. Utilizza la tecnica descritta in quella pagina che prevede l'utilizzo della % di utilizzo della GPU o del contatore traccia di un contatore simile per i limiti della durata frame, in quanto le tracce del contatore utilizzano tutte la stessa tecnica di temporizzazione e consentono di ottenere stime più accurate dell'utilizzo della memoria (rispetto all'utilizzo dei limiti della durata frame derivati dalle sezioni della GPU i cui dati vengono raccolti indipendentemente dai dati del contatore).

Canale di utilizzo allineato con i contatori pertinenti sottostanti
Figura 1. Il canale di utilizzo è allineato ai contatori pertinenti

Totali lettura/scrittura

Dopo aver evidenziato un singolo frame nel profiler, inizia osservando i contatori Totale lettura (byte/sec) e Totale scrittura (byte/sec). Questi contatori offrono una buona visione generale della quantità di dati che attraversano il bus di memoria nel corso di un singolo frame. Fai del tuo meglio per ridurre al minimo la quantità di dati inviati sul bus, dato che la larghezza di banda della memoria è una fonte importante di consumo della batteria sui dispositivi mobili.

Contatori totali lettura/scrittura
Figura 2. Contatori totali lettura e scrittura

Puoi anche esaminare i contatori Vertex Memory Read (Bytes/second) e Texture Memory Read (Bytes/Second) per determinare la parte della larghezza di banda utilizzata per i dati del vertice e delle texture.

Contatori di lettura memoria Vertex + Texture
Figura 3. Contatori di lettura memoria Vertex + Texture

Ciò che consideri "buono" per questi valori dipende dal tipo di carichi di lavoro rilevati nella tua app. Ad esempio, le applicazioni 2D potrebbero utilizzare quantità relativamente grandi (circa 2 GB/s) di larghezza di banda per la lettura della memoria delle texture in uso, ma la larghezza di banda della memoria verticale potrebbe essere molto minima (circa 50 MB/s). Per ulteriori dettagli, consulta la documentazione relativa alle sezioni Analisi della larghezza di banda della memoria del vertice e Analisi dell'utilizzo della larghezza di banda della memoria delle texture.

Blocchi del recupero

Osserva i contatori % stallo recupero Vertex, % stallo recupero texture e % stallo sulla memoria di sistema, in quanto ti daranno alcuni indizi sulle prestazioni generali della memoria della nostra applicazione. Se i valori sono superiori a circa il 5%, significa che la tua app non dispone del layout dei dati in memoria in modo efficiente o che accede ai dati in modo efficiente per sfruttare la cache. Per informazioni dettagliate su come migliorare l'utilizzo della memoria per questi tipi di asset, consulta le sezioni Analisi della larghezza di banda della memoria del vertice e Analisi dell'utilizzo della larghezza di banda della memoria delle texture.

Contatori di blocchi di memoria
Figura 4. Contatori di stallo di memoria

Dispositivi in Mali

Sui dispositivi Mali, inizia evidenziando innanzitutto un periodo di tempo coerente con un singolo frame GPU, come descritto in Stimare i tempi di elaborazione dei frame di CPU e GPU. Utilizza la tecnica descritta in quella pagina che prevede l'utilizzo della % di utilizzo della GPU o del contatore traccia di un contatore simile per i limiti della durata frame, in quanto le tracce del contatore utilizzano tutte la stessa tecnica di temporizzazione e consentono di ottenere stime più accurate dell'utilizzo della memoria (rispetto all'utilizzo dei limiti della durata frame derivati dalle sezioni della GPU i cui dati vengono raccolti indipendentemente dai dati del contatore).

Traccia di utilizzo allineata ai contatori di tuo interesse sottostanti
Figura 5. Traccia di utilizzo allineata ai contatori che ti interessano riportati di seguito

Totali esterni output

Dopo aver evidenziato un singolo frame nel System Profiler, inizia esaminando i contatori dei byte di lettura esterni di output byte di scrittura esterna di output. Questi contatori offrono una buona visione generale della quantità di dati che attraversano il bus di memoria nel corso di un singolo frame. Fai del tuo meglio per ridurre al minimo la quantità di dati che invii sul bus, dato che la larghezza di banda della memoria è una fonte di grande consumo di batteria sui dispositivi mobili.

Tracce contatore esterno di output
Figura 6. Tracce del contatore esterno di output

Totali interni dell'input

Esistono anche contatori che forniscono informazioni sulle cache stesse. I contatori che ti interessano sono "cicli di stallo interni [lettura|scrittura]". Valori più elevati indicano che stai esaurendo la cache correttamente, ma sono state effettuate troppe richieste di lettura e, di conseguenza, il codice dello Shall si blocca in attesa di accedere alla memoria.

Traccia contatore interno di input
Figura 7. Tracce del contatore interno di input

Blocchi del recupero

I contatori successivi che puoi esaminare sono quelli Vertex Prefetcher Stall Cycles e Texture Fetch Stall, in quanto forniscono alcuni suggerimenti sulle prestazioni complessive della memoria della nostra applicazione. Se noti valori superiori al 5% circa, significa che non stai distendendo i nostri dati in memoria in modo efficiente o che stai accedendo in modo efficiente per sfruttare la cache. Per maggiori dettagli su come migliorare l'utilizzo della memoria per questi tipi di asset, consulta gli articoli sull'analisi della larghezza di banda della memoria di [Vertex|Texture]

Contatore tracce stalli di recupero
Figura 8. I contatori delle bancarelle di recupero