Acquisisci le metriche di Macrobenchmark

Concetti e implementazione di Jetpack Compose

Le metriche sono il tipo principale di informazioni estratte dai benchmark. Vengono trasmesse alla funzione measureRepeated come List, che ti consente di specificare più metriche misurate contemporaneamente. Per l'esecuzione del benchmark è richiesto almeno un tipo di metrica.

Il seguente snippet di codice acquisisce le metriche relative alla tempistica dei frame e alla sezione di traccia personalizzata:

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 questo esempio, RV CreateView e RV OnBindView sono gli ID dei blocchi tracciabili definiti in RecyclerView. Il codice sorgente del metodo createViewHolder() è un esempio di come puoi definire blocchi tracciabili all'interno del tuo codice.

StartupTimingMetric, TraceSectionMetric e FrameTimingMetric sono trattati in dettaglio più avanti in questo documento. Per un elenco completo delle metriche, consulta le sottoclassi di Metric.

I risultati del benchmark vengono inviati ad Android Studio, come mostrato nella Figura 1. Se vengono definite più metriche, tutte vengono combinate nell'output.

Risultati di TraceSectionMetric e FrameTimingMetric.
Figura 1. Risultati di TraceSectionMetric e FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric acquisisce le metriche di temporizzazione dell'avvio dell'app con i seguenti valori:

  • timeToInitialDisplayMs: il tempo che intercorre tra il momento in cui il sistema riceve un intent di avvio e il momento in cui viene visualizzato il primo frame della destinazione Activity.
  • timeToFullDisplayMs: il periodo di tempo che intercorre tra il momento in cui il sistema riceve un intent di avvio e il momento in cui l'app segnala di essere stata disegnata completamente utilizzando il metodo reportFullyDrawn(). La misurazione si interrompe al completamento del rendering del primo frame dopo la chiamata reportFullyDrawn() o che la contiene. Questa misurazione potrebbe non essere disponibile su Android 10 (livello API 29) e versioni precedenti.

StartupTimingMetric restituisce i valori minimo, mediano e massimo delle iterazioni di avvio. Per valutare il miglioramento dell'avvio, concentrati sempre sui valori mediani, poiché forniscono la migliore stima dei tempi di avvio tipici degli utenti. Per maggiori informazioni su cosa contribuisce al tempo di avvio dell'app, consulta Tempo di avvio dell'app.

Risultati di StartupTimingMetric
Figura 2. StartupTimingMetric risultati.

FrameTimingMetric

FrameTimingMetric acquisisce le informazioni sulla tempistica dei frame prodotti da un benchmark, ad esempio lo scorrimento o l'animazione, e restituisce i seguenti valori:

  • frameOverrunMs: il tempo di ritardo di un determinato frame rispetto alla scadenza. I numeri positivi indicano un frame perso accompagnato da scatti o interruzioni visibili. I numeri negativi indicano di quanto un frame è stato completato più velocemente rispetto alla scadenza dell'hardware del sottosistema. Nota: questa metrica è disponibile solo su Android 12 (livello API 31) e versioni successive.
  • frameDurationCpuMs: il tempo necessario per produrre il frame sulla CPU sia nel thread dell'interfaccia utente sia in RenderThread.

Queste misurazioni vengono raccolte in una distribuzione del 50°, 90°, 95° e 99° percentile.

Per saperne di più su come identificare e migliorare i frame lenti, consulta Rendering lento.

Risultati di FrameTimingMetric
Figura 3. FrameTimingMetric risultati.

TraceSectionMetric

TraceSectionMetric acquisisce il numero di volte in cui si verifica una sezione specifica della traccia e il tempo assoluto necessario per l'esecuzione. Per il monitoraggio del tempo, vengono restituiti i tempi minimo, mediano e massimo in millisecondi.

La sezione della traccia di destinazione è definita dalla chiamata di funzione trace(sectionName) o dai limiti dei blocchi di livello inferiore tra Trace.beginSection(sectionName) e Trace.endSection() o dalle loro varianti asincrone. Seleziona sempre la prima istanza di una sezione di traccia acquisita durante una misurazione. Per impostazione predefinita, restituisce solo le sezioni di traccia del pacchetto. Per includere i processi esterni al pacchetto, imposta targetPackageOnly = false.

Per ulteriori informazioni sulla tracciabilità, vedi Panoramica della tracciabilità del sistema e Definire eventi personalizzati.

TraceSectionMetric
Figura 4. TraceSectionMetric risultati.