Acquisisci le metriche di Macrobenchmark

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

Il seguente snippet di codice acquisisce le metriche di temporizzazione dei frame e della sezione della 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 per il metodo createViewHolder() è un esempio di come è possibile definire blocchi tracciabili all'interno del tuo codice.

Le sezioni StartupTimingMetric, TraceSectionMetric, FrameTimingMetric e PowerMetric vengono trattate in dettaglio più avanti in questo documento.

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

Risultati di TraceSezioneMetric e metrica FrameTiming.
Figura 1. Risultati di TraceSectionMetric e FrameTimingMetric.

Metrica dei tempi di avvio

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

  • timeToInitialDisplayMs: il tempo che intercorre tra il momento in cui il sistema riceve un intent di lancio e il momento in cui esegue il rendering del primo frame della destinazione Activity.
  • timeToFullDisplayMs: il periodo di tempo che intercorre tra il momento in cui il sistema riceve un intento di lancio e il momento in cui l'app segnala un'elaborazione completa utilizzando il metodo reportFullyDrawn(). La misurazione si interrompe al termine del rendering del primo frame dopo o contenente la chiamata a reportFullyDrawn(). Questa misurazione potrebbe non essere disponibile su Android 10 (livello API 29) e versioni precedenti.

StartupTimingMetric restituisce i valori min, mediana e max dalle iterazioni di avvio. Per valutare il miglioramento delle startup dovresti concentrarti sui valori mediani, poiché forniscono la migliore stima dei tempi di avvio tipici. Per ulteriori informazioni su cosa contribuisce al tempo di avvio dell'app, consulta la sezione Tempi di avvio dell'app.

Risultati StartupTimingMetric
Figura 2. StartupTimingMetric risultati.

Metrica del tempo frame

FrameTimingMetric acquisisce informazioni di tempo dai frame prodotti da un benchmark, come uno scorrimento o un'animazione, e restituisce i seguenti valori:

  • frameOverrunMs: la quantità di tempo entro il quale un determinato frame non rispetta la scadenza. I numeri positivi indicano un frame ignorato e un jank o una stutter visibili. I numeri negativi indicano quanto un frame è più veloce rispetto alla scadenza. Nota: questa funzionalità è disponibile solo su Android 12 (livello API 31) e versioni successive.
  • frameDurationCpuMs: il tempo necessario per la produzione del frame sulla CPU sia nel thread dell'interfaccia utente che in RenderThread.

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

Per maggiori informazioni su come identificare e migliorare i frame lenti, consulta Rendering lento.

Risultati relativi al parametro FrameTiming
Figura 3. FrameTimingMetric risultati.

Metrica TraceSezione

TraceSectionMetric acquisisce il numero di volte in cui si verifica una sezione di traccia corrispondente al sectionName specificato e il tempo necessario. Per il tempo, restituisce i tempi minimo, mediano e massimo in millisecondi. La sezione della traccia è definita dalla chiamata di funzione trace(sectionName) o dal codice tra Trace.beginSection(sectionName) e Trace.endSection() o le rispettive 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 al di fuori del pacchetto, imposta targetPackageOnly = false.

Per ulteriori informazioni sul tracciamento, consulta Panoramica del tracciamento del sistema e Definizione di eventi personalizzati.

Metrica TraceSezione
Figura 4. TraceSectionMetric risultati.

Metrica Power

PowerMetric acquisisce la variazione di potenza o energia nella durata del test per le categorie di potenza fornite. Ogni categoria selezionata viene suddivisa nei relativi sottocomponenti misurabili e le categorie non selezionate vengono aggiunte alla metrica "non selezionata".

Queste metriche misurano il consumo a livello di sistema, non in base a ogni app, e sono limitate ai dispositivi Pixel 6, Pixel 6 Pro e versioni successive:

  • power<category>Uw: la quantità di energia consumata per la durata del test in questa categoria.
  • energy<category>Uws: la quantità di energia trasferita per unità di tempo per la durata del test in questa categoria.

Le categorie includono:

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

Con alcune categorie, come CPU, potrebbe essere difficile separare il lavoro svolto da altri processi dal lavoro svolto dalla tua app. Per ridurre al minimo l'interferenza, rimuovi o limita le app e gli account non necessari.

Risultati di PowerMetric
Figura 5. PowerMetric risultati.