Konzepte und Jetpack Compose-Implementierung
Messwerte sind die wichtigste Art von Informationen, die aus Ihren Benchmarks extrahiert werden. Sie
werden als List an die measureRepeated Funktion übergeben, sodass Sie
mehrere gemessene Messwerte gleichzeitig angeben können. Für die Ausführung des Benchmarks ist mindestens ein Messwerttyp erforderlich.
Das folgende Code-Snippet erfasst Messwerte für das Frame-Timing und benutzerdefinierte 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 createViewHolder() Methode ist ein Beispiel dafür, wie Sie nachverfolgbare Blöcke in Ihrem eigenen Code definieren können.
StartupTimingMetric, TraceSectionMetric und
FrameTimingMetric werden später in diesem Dokument ausführlich behandelt. Eine
vollständige Liste der Messwerte finden Sie in den Unterklassen von Metric.
Benchmark-Ergebnisse werden in Android Studio ausgegeben, wie in Abbildung 1 dargestellt. Wenn mehrere Messwerte definiert sind, werden sie alle in der Ausgabe kombiniert.
TraceSectionMetric und
FrameTimingMetric.StartupTimingMetric
StartupTimingMetric erfasst Messwerte für das Start-Timing von Apps mit den folgenden Werten:
timeToInitialDisplayMs: Die Zeitspanne zwischen dem Empfang einer Start-Intent durch das System und dem Rendern des ersten Frames der ZielActivity.timeToFullDisplayMs: Die Zeitspanne zwischen dem Empfang einer Start-Intent durch das System und dem Zeitpunkt, zu dem die App mit derreportFullyDrawn()Methode meldet, dass sie vollständig gerendert wurde. Die Messung wird abgeschlossen, wenn der erste Frame nach dem Aufruf vonreportFullyDrawn()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 der Start-Iterationen aus. Um die Startverbesserung zu bewerten, sollten Sie sich immer auf die Medianwerte konzentrieren, da sie die beste Schätzung der typischen Startzeiten für Nutzer liefern. Weitere Informationen zu den Faktoren, die zur Startzeit von Apps beitragen, finden Sie unter Startzeit von Apps.
StartupTimingMetric Ergebnisse.FrameTimingMetric
FrameTimingMetric erfasst Timing-Informationen von Frames, die von einem Benchmark erzeugt wurden, z. B. beim Scrollen oder bei Animationen, und gibt die folgenden Werte aus:
frameOverrunMs: Die Zeitspanne, um die ein bestimmter Frame seine Frist verpasst. Positive Zahlen weisen auf einen verworfenen Frame hin, der mit sichtbaren Rucklern oder Stottern einhergeht. Negative Zahlen geben an, wie viel schneller ein Frame im Vergleich zur Hardware-Frist des Subsystems fertiggestellt wurde. Hinweis: Dieser Messwert ist nur unter Android 12 (API-Level 31) und höher verfügbar.frameDurationCpuMs: Die Zeitspanne, die für die Erstellung des Frames auf der CPU im UI-Thread und imRenderThreadbenötigt wird.
Diese Messungen werden in einer Verteilung des 50., 90., 95. und 99. Perzentils erfasst.
Weitere Informationen zum Identifizieren und Verbessern langsamer Frames finden Sie unter Langsames Rendering.
FrameTimingMetric Ergebnisse.TraceSectionMetric
TraceSectionMetric erfasst die Anzahl der Vorkommen eines bestimmten Trace-Abschnitts und die absolute Zeit, die für die Ausführung benötigt wird. Für die Zeitmessung werden die Minimal-, Median- und Maximalzeiten in Millisekunden ausgegeben.
Der Ziel-Trace-Abschnitt wird entweder durch den Funktionsaufruf
trace(sectionName) oder durch die Blockgrenzen auf niedrigerer Ebene zwischen
Trace.beginSection(sectionName) und Trace.endSection() oder deren
asynchronen 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 Ihres Pakets einbeziehen möchten, legen Sie targetPackageOnly =
false fest.
Weitere Informationen zum Tracing finden Sie unter System-Tracing – Übersicht und Benutzerdefinierte Ereignisse definieren.
TraceSectionMetric Ergebnisse.Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Baseline-Profile erstellen {:#creating-profile-rules}
- Makrobenchmark schreiben
- Analyse und Optimierung des App-Starts {:#app-startup-analysis-optimization}