Konzepte und Jetpack Compose-Implementierung
Messwerte sind die wichtigsten Informationen, die aus Ihren Benchmarks extrahiert werden. Sie werden als List an die Funktion measureRepeated übergeben, sodass Sie mehrere gemessene Messwerte gleichzeitig angeben können. Für die Ausführung des Benchmarks ist mindestens ein Messwerttyp erforderlich.
Mit dem folgenden Code-Snippet werden Messwerte für das Frame-Timing und 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 von rückverfolgbaren Blöcken, die in RecyclerView definiert sind. Der Quellcode für die Methode createViewHolder() ist ein Beispiel dafür, wie Sie verfolgbare 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.
Die Benchmark-Ergebnisse werden in Android Studio ausgegeben, wie in Abbildung 1 dargestellt. Wenn mehrere Messwerte definiert sind, werden alle in der Ausgabe kombiniert.
TraceSectionMetric und FrameTimingMetric.StartupTimingMetric
StartupTimingMetric erfasst Zeitmesswerte für den App-Start mit den folgenden Werten:
timeToInitialDisplayMs: Die Zeitspanne zwischen dem Empfang eines Start-Intents durch das System und dem Rendern des ersten Frames der Ziel-Activity.timeToFullDisplayMs: Die Zeitspanne zwischen dem Empfang eines Start-Intents durch das System und dem Zeitpunkt, an dem die App mit der MethodereportFullyDrawn()meldet, dass sie vollständig dargestellt wurde. Die Messung endet, wenn das Rendering des ersten Frames nach dem Aufruf oder mit demreportFullyDrawn()-Aufruf abgeschlossen ist. 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. Konzentrieren Sie sich bei der Bewertung der Startverbesserung immer auf die Medianwerte, da diese die beste Schätzung der typischen Startzeiten für Nutzer liefern. Weitere Informationen dazu, was zur Startzeit einer App beiträgt, finden Sie unter Startzeit der App.
StartupTimingMetric Ergebnisse.FrameTimingMetric
FrameTimingMetric erfasst Zeitinformationen aus Frames, die von einem Benchmark erzeugt werden, z. B. Scrollen oder Animation, und gibt die folgenden Werte aus:
frameOverrunMs: die Zeitspanne, um die ein bestimmter Frame seine Frist verpasst. Positive Zahlen weisen auf einen ausgelassenen Frame hin, der mit sichtbarem Ruckeln oder Stottern einhergeht. Negative Zahlen geben an, wie viel schneller ein Frame im Vergleich zur Hardware-Frist des Subsystems abgeschlossen wurde. Hinweis: Dieser Messwert ist nur ab Android 12 (API-Level 31) verfügbar.frameDurationCpuMs: die Zeit, die für die Erstellung des Frames auf der CPU sowohl im UI-Thread als auch imRenderThreadbenötigt wird.
Diese Messwerte 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, wie oft ein bestimmter Trace-Abschnitt auftritt und wie lange die Ausführung absolut dauert. Für die Zeiterfassung werden die Mindest-, Median- und Höchstzeiten in Millisekunden ausgegeben.
Der Ziel-Trace-Abschnitt wird entweder durch den Funktionsaufruf trace(sectionName) oder die untergeordneten Blockgrenzen 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 Ihres Pakets einbeziehen möchten, legen Sie targetPackageOnly =
false fest.
Weitere Informationen zum Tracing finden Sie unter Übersicht über das System-Tracing und Benutzerdefinierte Ereignisse definieren.
TraceSectionMetric Ergebnisse.Empfehlungen für Sie
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Baseline-Profile erstellen {:#creating-profile-rules}
- Makro-Benchmark schreiben
- Analyse und Optimierung des App-Starts {:#app-startup-analysis-optimization}