Makro-Benchmark-Messwerte erfassen

Messwerte sind die wichtigsten Informationen, die aus Ihren Benchmarks extrahiert werden. Sie werden als List an die Funktion measureRepeated übergeben, sodass Sie mehrere Messwerte gleichzeitig angeben können. Zum Ausführen der Benchmark ist mindestens ein Messwerttyp erforderlich.

Das folgende Code-Snippet erfasst Frame-Timings und benutzerdefinierte Messwerte für Trace-Abschnitte:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

In diesem Beispiel sind RV CreateView und RV OnBindView die IDs von nachverfolgbaren Blöcken, die in RecyclerView definiert sind. Der Quellcode für die Methode createViewHolder() ist ein Beispiel dafür, wie Sie nachverfolgbare Blöcke in Ihrem eigenen Code definieren können.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric und PowerMetric werden weiter unten in diesem Dokument ausführlich behandelt.

Benchmarkergebnisse werden an Android Studio ausgegeben, wie in Abbildung 1 dargestellt. Wenn mehrere Messwerte definiert sind, werden alle in der Ausgabe kombiniert.

Ergebnisse von TraceSectionMetric und FrameTimingMetric.
Abbildung 1: Ergebnisse von TraceSectionMetric und FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric erfasst Messwerte zum Zeitpunkt des App-Starts mit den folgenden Werten:

  • timeToInitialDisplayMs: Die Zeitspanne zwischen dem Empfang eines Start-Intents im System und dem Rendern des ersten Frames des Ziels Activity.
  • timeToFullDisplayMs: Die Zeitspanne zwischen dem Empfang eines Start-Intents im System und der vollständigen Erstellung der App mit der Methode reportFullyDrawn(). Die Messung endet, wenn das Rendern des ersten Frames nach dem reportFullyDrawn()-Aufruf abgeschlossen ist oder diesen enthält. Diese Messung ist unter Android 10 (API-Level 29) und niedriger möglicherweise nicht verfügbar.

StartupTimingMetric gibt die Minimal-, Median- und Maximalwerte aus den Startiterationen aus. Um die Startup-Verbesserung zu beurteilen, sollten Sie sich auf Medianwerte konzentrieren, da diese die beste Schätzung der typischen Startzeit liefern. Weitere Informationen dazu, was sich auf die Startzeit der Anwendung auswirkt, finden Sie unter App-Startzeit.

StartupTimingMetric-Ergebnisse
Abbildung 2: StartupTimingMetric Ergebnisse.

FrameTiming-Messwert

FrameTimingMetric erfasst Zeitinformationen aus Frames, die von einer Benchmark erzeugt wurden, z. B. Scrollen oder Animationen, und gibt die folgenden Werte aus:

  • frameOverrunMs: die Zeitspanne, um die ein bestimmter Frame seine Frist verpasst. Positive Zahlen kennzeichnen ein abgebrochenes Frame und eine sichtbare Verzögerung oder Ruckeln. Negative Zahlen geben an, wie viel schneller ein Frame das Zeitlimit überschreitet. Hinweis: Diese Funktion ist nur unter Android 12 (API-Level 31) und höher verfügbar.
  • frameDurationCpuMs: Die Zeit, die der Frame benötigt, um auf der CPU sowohl im UI-Thread als auch im RenderThread zu erzeugen.

Diese Messungen werden in einer Verteilung des 50., 90., 95. und 99. Perzentils erfasst.

Weitere Informationen zum Erkennen und Verbessern langsamer Frames findest du unter Langsames Rendering.

FrameTimingMetric-Ergebnisse
Abbildung 3: FrameTimingMetric Ergebnisse.

TracesectionMesswert

TraceSectionMetric erfasst, wie oft ein Trace-Abschnitt, der mit dem bereitgestellten sectionName übereinstimmt, und die erforderliche Zeit auftreten. Für die Zeit werden die Mindest-, Median- und Höchstzeiten in Millisekunden ausgegeben. Der Trace-Abschnitt wird entweder durch den Funktionsaufruf trace(sectionName), den Code zwischen Trace.beginSection(sectionName) und Trace.endSection() oder deren asynchrone Varianten definiert. Es wird immer die erste Instanz eines Trace-Abschnitts ausgewählt, der während einer Messung erfasst wurde. Standardmäßig werden nur Trace-Abschnitte aus Ihrem Paket ausgegeben. Wenn Sie Prozesse außerhalb des Pakets einschließen möchten, legen Sie targetPackageOnly = false fest.

Weitere Informationen zum Tracing finden Sie unter Übersicht über System-Tracing und Benutzerdefinierte Ereignisse definieren.

TracesectionMesswert
Abbildung 4: TraceSectionMetric Ergebnisse.

PowerMetric

PowerMetric erfasst die Änderung der Energie oder Energie während des Tests für die angegebenen Leistungskategorien. Jede ausgewählte Kategorie wird in ihre messbaren Unterkomponenten unterteilt und nicht ausgewählte Kategorien werden dem nicht ausgewählten Messwert hinzugefügt.

Mit diesen Messwerten wird der systemweite Verbrauch gemessen, nicht der pro App. Sie sind auf Pixel 6, Pixel 6 Pro und neuere Geräte beschränkt:

  • power<category>Uw: die verbrauchte Energie während der Dauer des Tests in dieser Kategorie.
  • energy<category>Uws: die pro Zeiteinheit übertragene Energie für die Dauer Ihres Tests in dieser Kategorie.

Zu den Kategorien gehören:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

Bei einigen Kategorien, z. B. CPU, kann es schwierig sein, die Arbeit anderer Prozesse von der Arbeit Ihrer eigenen Anwendung zu trennen. Entfernen oder beschränken Sie unnötige Anwendungen und Konten, um die Störungen zu minimieren.

PowerMetric-Ergebnisse
Abbildung 5: PowerMetric Ergebnisse.