Capturer les métriques Macrobenchmark

Concepts et implémentation de Jetpack Compose

Les métriques sont le principal type d'informations extraites de vos analyses comparatives. Elles sont transmises à la measureRepeated fonction en tant que List, ce qui vous permet de préciser plusieurs métriques mesurées à la fois. Au moins un type de métrique est requis pour que l'analyse comparative s'exécute.

L'extrait de code suivant capture les métriques de temps de rendu et de section de trace personnalisée :

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
    // ...
);

Dans cet exemple, RV CreateView et RV OnBindView sont les identifiants de blocs traçables définis dans RecyclerView. Le code source de la méthode createViewHolder() montre comment vous pouvez définir des blocs traçables dans votre propre code.

StartupTimingMetric, TraceSectionMetric et FrameTimingMetric sont abordés en détail plus loin dans ce document. Pour obtenir la liste complète des métriques, consultez les sous-classes de Metric.

Les résultats du benchmark sont générés dans Android Studio, comme illustré dans la figure 1. Si plusieurs métriques sont définies, elles sont toutes combinées dans la sortie.

Résultats de TraceSectionMetric et de FrameTimingMetric
Figure 1 : Résultats de TraceSectionMetric et FrameTimingMetric

StartupTimingMetric

StartupTimingMetric capture les métriques de temps de démarrage de l'application avec les valeurs suivantes :

  • timeToInitialDisplayMs : temps écoulé entre le moment où le système reçoit un intent de lancement et le moment où le premier frame de la destination Activity.
  • timeToFullDisplayMs : temps écoulé entre le moment où le système reçoit un intent de lancement et le moment où l'application indique qu'elle est entièrement dessinée à l'aide de la reportFullyDrawn() méthode. La mesure s'arrête à la fin du rendu du premier frame après l'appel reportFullyDrawn() ou le contenant. Cette mesure peut ne pas être disponible sur Android 10 (niveau d'API 29) ou version antérieure.

StartupTimingMetric génère les valeurs minimale, médiane et maximale des itérations de démarrage. Pour évaluer l'amélioration du démarrage, concentrez-vous toujours sur les valeurs médianes, car elles fournissent la meilleure estimation des temps de démarrage types des utilisateurs. Pour en savoir plus sur les facteurs qui contribuent au temps de démarrage de l'application, consultez la page Temps de démarrage de l'application.

Résultats de StartupTimingMetric
Figure 2 : Résultats de StartupTimingMetric.

FrameTimingMetric

FrameTimingMetric capture les informations de codes temporels des frames issues d'une analyse comparative, telles qu'un défilement ou une animation, et génère les valeurs suivantes :

  • frameOverrunMs : temps de retard du frame par rapport à son échéance. Les nombres positifs indiquent un abandon du frame accompagné d'un à-coup ou d'une saccade visible. Les nombres négatifs indiquent l'avance d'un frame par rapport à l'échéance matérielle du sous-système. Remarque : Cette métrique n'est disponible que sur Android 12 (niveau d'API 31) ou version ultérieure.
  • frameDurationCpuMs: temps nécessaire à la génération du frame sur le processeur au niveau du thread UI et du RenderThread.

Ces mesures sont collectées par étapes de 50, 90, 95 et 99 %.

Pour savoir comment identifier et améliorer les frames trop lents, consultez Affichage lent.

Résultats de FrameTimingMetric
Figure 3 : Résultats de FrameTimingMetric.

TraceSectionMetric

TraceSectionMetric capture le nombre de fois qu'une section de trace spécifique se produit et la durée absolue de son exécution. Pour le suivi du temps, elle renvoie les durées minimale, médiane et maximale en millisecondes.

La section de trace cible est définie soit par l'appel de fonction trace(sectionName) soit par les limites de bloc de niveau inférieur entre Trace.beginSection(sectionName) et Trace.endSection() ou leurs variantes asynchrones. Il sélectionne toujours la première instance d'une section de trace capturée lors d'une mesure. Par défaut, il génère uniquement les sections de trace de votre package par défaut. Pour inclure des processus en dehors de votre package, définissez targetPackageOnly = false.

Pour en savoir plus sur le traçage, consultez Présentation du traçage système et Définir des événements personnalisés.

TraceSectionMetric
Figure 4 : Résultats TraceSectionMetric.