Speichereffizienz analysieren

Die Arbeitsspeichernutzung einer App ist ein grundlegender Aspekt ihrer Leistung. Mit dem System Profiler können Sie diese Merkmale anhand der verfügbaren GPU-Zählerinformationen analysieren.

Adreno-Geräte

Markieren Sie auf Adreno-Geräten zuerst einen Zeitraum, der einem einzelnen GPU-Frame entspricht, wie unter CPU- und GPU-Frame-Verarbeitungszeiten schätzen beschrieben. Verwenden Sie die auf dieser Seite beschriebene Methode, bei der die GPU-Auslastung in % oder ein ähnlicher Zähler-Track für Ihre Frame-Time-Grenzwerte verwendet wird. Bei allen Zähler-Tracks wird dieselbe Timing-Methode verwendet, sodass genauere Schätzungen der Arbeitsspeicherauslastung möglich sind (im Vergleich zur Verwendung der Frame-Time-Grenzwerte, die aus den GPU-Slices abgeleitet werden, deren Daten unabhängig von den Zähler-Track-Daten erfasst werden).

Die Auslastung stimmt mit den entsprechenden Zählern darunter überein.
Abbildung 1. Ausrichtung des Nutzungstracks an den entsprechenden Zählern darunter

Lese-/Schreibvorgänge insgesamt

Nachdem Sie einen einzelnen Frame im Profiler markiert haben, sehen Sie sich zuerst die Zähler Read Total (Bytes/sec) und Write Total (Bytes/sec) an. Diese Zähler geben einen guten Überblick darüber, wie viele Daten im Laufe eines einzelnen Frames über den Speicherbus übertragen werden. Versuchen Sie, die Menge der Daten, die Sie über den Bus senden, so gering wie möglich zu halten, da die Speicherbandbreite eine große Quelle für den Akkuverbrauch auf Mobilgeräten ist.

Gesamtzähler für Lese- und Schreibvorgänge
Abbildung 2. Gesamtzähler für Lese- und Schreibvorgänge

Sie können auch die Zähler Vertex Memory Read (Bytes/Second) und Texture Memory Read (Bytes/Second) untersuchen, um den Teil der Bandbreite zu ermitteln, der für Vertex- und Texturdaten verwendet wird.

Zähler für Vertex- und Texturarbeitsspeicher-Lesevorgänge
Abbildung 3. Vertex- und Texturspeicher-Lesezähler

Was Sie für diese Werte als „gut“ betrachten, hängt von der Art der Arbeitslasten ab, die in Ihrer App auftreten. Bei 2D-Anwendungen kann beispielsweise eine relativ große Bandbreite für das Lesen von Texturspeicher (~2 GB/s) verwendet werden, die Bandbreite für den Vertex-Arbeitsspeicher kann jedoch sehr gering sein (~50 MB/s). Weitere Informationen finden Sie in der Dokumentation zu Vertex-Speicherbandbreite analysieren und Nutzung der Texturspeicherbandbreite analysieren.

Abruf-Stalls

Sehen Sie sich die Zähler % Vertex Fetch Stall, % Texture Fetch Stall und % Stall on System Memory an, da diese Hinweise auf die allgemeine Speicherleistung Ihrer Anwendung geben. Wenn die Werte höher als etwa 5 % sind, deutet das darauf hin, dass Ihre App Daten entweder nicht effizient im Speicher anordnet oder nicht effizient auf ihre Daten zugreift, um den Cache zu nutzen. Weitere Informationen zur Verbesserung der Arbeitsspeichernutzung für diese Arten von Assets finden Sie unter Vertex-Arbeitsspeicherbandbreite analysieren und Textur-Arbeitsspeicherbandbreitennutzung analysieren.

Zähler für Arbeitsspeicher-Stalls
Abbildung 4. Zähler für Arbeitsspeicher-Stalls

Mali-Geräte

Markieren Sie auf Mali-Geräten zuerst einen Zeitraum, der einem einzelnen GPU-Frame entspricht, wie unter CPU- und GPU-Frame-Verarbeitungszeiten schätzen beschrieben. Verwenden Sie die auf dieser Seite beschriebene Methode, bei der die GPU-Auslastung in % oder ein ähnlicher Zähler-Track für Ihre Frame-Time-Grenzwerte verwendet wird. Bei allen Zähler-Tracks wird dieselbe Timing-Methode verwendet, sodass genauere Schätzungen der Arbeitsspeicherauslastung möglich sind (im Vergleich zur Verwendung der Frame-Time-Grenzwerte, die aus den GPU-Slices abgeleitet werden, deren Daten unabhängig von den Zähler-Track-Daten erfasst werden).

Die Linie für die Auslastung stimmt mit den Zählern überein, die Sie darunter sehen.
Abbildung 5. Die Nutzungslinie stimmt mit den Zählern überein, die Sie unten sehen.

Externe Summen ausgeben

Nachdem Sie im Systemprofiler einen einzelnen Frame markiert haben, sehen Sie sich zuerst die Zähler Output External Read bytes (Externe Ausgabelesebytes) und Output External Write bytes (Externe Ausgabeschreibbytes) an. Diese Zähler geben einen guten Überblick darüber, wie viele Daten im Laufe eines einzelnen Frames über den Speicherbus übertragen werden. Versuchen Sie, die Menge der Daten, die Sie über den Bus senden, so gering wie möglich zu halten, da die Speicherbandbreite eine große Quelle für den Akkuverbrauch auf Mobilgeräten ist.

Externe Zähler-Tracks ausgeben
Abbildung 6. Externe Zähler-Tracks ausgeben

Interne Gesamtsummen eingeben

Es gibt auch Zähler, die Informationen zu den Caches selbst liefern. Die Zähler, die Sie interessieren, sind „Input internal [read|write] stall cycles“. Höhere Werte für diese Zähler bedeuten, dass Sie den Cache erfolgreich nutzen, aber zu viele Leseanfragen gestellt werden. Infolgedessen wird der Shader-Code angehalten, bis er Zugriff auf den Speicher erhält.

Interne Zähler-Tracks eingeben
Abbildung 7. Interne Zähler-Tracks eingeben

Abruf-Stalls

Als Nächstes können Sie sich die Zähler Vertex Prefetcher Stall Cycles und Texture Fetch Stall ansehen, da diese Hinweise auf die allgemeine Speicherleistung Ihrer Anwendung geben. Wenn Sie Werte über etwa 5% sehen, bedeutet das, dass Sie unsere Daten entweder nicht effizient im Arbeitsspeicher anordnen oder nicht effizient darauf zugreifen, um den Cache zu nutzen. In den Artikeln zur Analyse der [Vertex|Texture]-Speicherbandbreite finden Sie Informationen dazu, wie Sie die Arbeitsspeichernutzung für diese Arten von Assets verbessern können.

Zähler für Abrufverzögerungen erfassen
Abbildung 8. Zähler für Stalls abrufen