Acquisisci le metriche di Macrobenchmark

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

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, FrameTimingMetric e PowerMetric 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 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 o contenente la chiamata reportFullyDrawn(). 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, devi concentrarti sui valori mediani, in quanto forniscono la migliore stima del tempo di avvio tipico. Per ulteriori 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 uno scorrimento o un'animazione, e restituisce i seguenti valori:

  • frameOverrunMs: il periodo di tempo in cui un determinato frame non rispetta la scadenza. I numeri positivi indicano un frame perso e un'interruzione o un'esitazione visibile. I numeri negativi indicano di quanto un frame è più veloce della scadenza. Nota: questa funzionalità è disponibile solo su Android 12 (livello API 31) e versioni successive.
  • frameDurationCpuMs: il tempo necessario per produrre il frame sulla CPU sia nel thread UI sia nel RenderThread.

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

Per ulteriori informazioni 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 di traccia corrispondente a sectionName fornito e la quantità di tempo necessaria. Per il tempo, restituisce i tempi minimi, mediani e massimi 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 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 sul tracciamento, vedi Panoramica del tracciamento del sistema e Definire eventi personalizzati.

TraceSectionMetric
Figura 4. TraceSectionMetric risultati.

PowerMetric

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

Queste metriche misurano il consumo a livello di sistema, non il consumo per app, e sono limitate a Pixel 6, Pixel 6 Pro e modelli successivi:

  • power<category>Uw: la quantità di energia consumata durante 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 da quello svolto dalla tua app. Per ridurre al minimo le interferenze, rimuovi o limita app e account non necessari.

Risultati di PowerMetric
Figura 5. PowerMetric risultati.