Makro-Benchmark-Messwerte erfassen

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

Im folgenden Code-Snippet werden Frame-Timing und Messwerte für benutzerdefinierte Trace-Abschnitte erfasst:

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 der zu verfolgenden Blöcke, die in RecyclerView definiert sind. Der Quellcode für die Methode createViewHolder() ist ein Beispiel dafür, wie Sie in Ihrem eigenen Code nachvollziehbare Blöcke definieren können.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric und PowerMetric werden später in diesem Dokument ausführlich behandelt.

Die Benchmark-Ergebnisse werden in Android Studio ausgegeben, wie in Abbildung 1 dargestellt. Wenn mehrere Messwerte definiert sind, werden sie in der Ausgabe kombiniert.

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

StartupTimingMetric

StartupTimingMetric erfasst Messwerte zum Startzeitpunkt der App mit den folgenden Werten:

  • timeToInitialDisplayMs: Die Zeitspanne zwischen dem Empfang einer Startabsicht durch das System und dem Rendern des ersten Frames des Ziels Activity.
  • timeToFullDisplayMs: Die Zeitspanne zwischen dem Empfang einer Startabsicht durch das System und dem Bericht, dass die App mit der Methode reportFullyDrawn() vollständig dargestellt wurde. Die Messung endet, sobald der erste Frame nach oder mit dem reportFullyDrawn()-Aufruf gerendert wurde. 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. Wenn Sie die Verbesserung der Startzeit beurteilen möchten, sollten Sie sich auf Medianwerte konzentrieren, da sie die beste Schätzung der typischen Startzeit liefern. Weitere Informationen dazu, was zur App-Startzeit beiträgt, finden Sie unter App-Startzeit.

Ergebnisse für „StartupTimingMetric“
Abbildung 2: StartupTimingMetric Ergebnisse.

FrameTimingMetric

FrameTimingMetric erfasst Zeitinformationen aus Frames, die von einem Benchmark erstellt wurden, z. B. ein Scrollen oder eine Animation, und gibt die folgenden Werte aus:

  • frameOverrunMs: die Zeitspanne, um die ein bestimmter Frame seine Frist verpasst. Positive Zahlen geben an, dass ein Frame verloren gegangen ist und es zu Rucklern oder Aussetzern kommt. Negative Zahlen geben an, um wie viel schneller ein Frame als der Termin ist. Hinweis: Diese Funktion ist nur unter Android 12 (API-Level 31) und höher verfügbar.
  • frameDurationCpuMs: Die Zeit, die benötigt wird, um den Frame sowohl im UI-Thread als auch im RenderThread auf der CPU zu erstellen.

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

Weitere Informationen zum Identifizieren und Optimieren langsamer Frames findest du unter Langsames Rendern.

Ergebnisse für FrameTimingMetric
Abbildung 3 FrameTimingMetric Ergebnisse.

TraceSectionMetric

TraceSectionMetric erfasst, wie oft ein Trace-Abschnitt mit der angegebenen sectionName auftritt und wie lange er dauert. Für die Zeit werden die Mindest-, Median- und Maximalzeiten in Millisekunden ausgegeben. Der Trace-Abschnitt wird entweder durch den Funktionsaufruf trace(sectionName) oder den Code zwischen Trace.beginSection(sectionName) und Trace.endSection() oder deren asynchronen Varianten definiert. Es wird immer die erste Instanz eines während einer Messung erfassten Trace-Abschnitts ausgewählt. Standardmäßig werden nur Trace-Abschnitte aus Ihrem Paket ausgegeben. Wenn Sie Prozesse außerhalb Ihres Pakets einbeziehen möchten, setzen Sie targetPackageOnly = false.

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

TraceSectionMetric
Abbildung 4: TraceSectionMetric Ergebnisse.

PowerMetric

PowerMetric erfasst die Änderung der Leistung oder Energie während des Tests für die angegebenen Leistungskategorien. Jede ausgewählte Kategorie wird in ihre messbaren Unterkomponenten aufgeschlüsselt. Nicht ausgewählte Kategorien werden dem Messwert „Nicht ausgewählt“ hinzugefügt.

Diese Messwerte messen den systemweiten Verbrauch, nicht den Verbrauch pro App. Sie sind auf Google Pixel 6, Google Pixel 6 Pro und neuere Geräte beschränkt:

  • power<category>Uw: Die in dieser Kategorie während des Tests verbrauchten Strommenge.
  • energy<category>Uws: Die übertragene Energie pro Zeiteinheit während der Dauer des Tests in dieser Kategorie.

Zu den Kategorien gehören:

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

Bei einigen Kategorien wie CPU kann es schwierig sein, die von anderen Prozessen ausgeführten Aufgaben von denen Ihrer eigenen App zu unterscheiden. Entfernen oder beschränken Sie unnötige Apps und Konten, um die Störungen zu minimieren.

Ergebnisse für Leistungsmesswerte
Abbildung 5: PowerMetric Ergebnisse.