Acquisisci le metriche di Macrobenchmark

Le metriche sono il tipo principale di informazioni estratte dai benchmark. vengono passati alla funzione measureRepeated come List, che consente di specificare più metriche misurate contemporaneamente. È necessario almeno un tipo di metrica per eseguire il benchmark.

Il seguente snippet di codice acquisisce le metriche relative alla temporizzazione dei frame e alle sezioni di traccia personalizzate:

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.

I risultati del benchmark vengono visualizzati in Android Studio, come mostrato nella figura 1. Se sono definite più metriche, tutte vengono combinate nell'output.

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

StartupTimingMetric

StartupTimingMetric cattura le metriche relative ai tempi di avvio dell'app con i seguenti valori:

  • timeToInitialDisplayMs: il tempo che intercorre tra il momento in cui il sistema riceve un intento di lancio e quello in cui viene visualizzato il primo frame della destinazione Activity.
  • timeToFullDisplayMs: il tempo che intercorre tra il momento in cui il sistema riceve un intento di lancio e quello in cui l'app segnala di essere stata completamente disegnata utilizzando il metodo reportFullyDrawn(). La misurazione si interrompe al termine 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 del tempo di avvio, concentrati sui valori mediani, poiché forniscono la stima migliore 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 cattura le informazioni sui tempi dai frame prodotti da un benchmark, ad esempio scorrimento o 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 e un tremolio o uno scatto visibili. I numeri negativi indicano 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 dell'interfaccia utente sia in 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 cattura il numero di volte in cui si verifica una sezione di traccia corrispondente al sectionName fornito e la durata del processo. Per il tempo, vengono visualizzati i tempi minimi, mediani e massimi in millisecondi. La sezione di traccia è definita dalla chiamata di funzione trace(sectionName) o dal codice tra Trace.beginSection(sectionName) e Trace.endSection() o dalle loro varianti asincrone. Seleziona sempre la prima istanza di una sezione della traccia acquisita durante una misurazione. Per impostazione predefinita, vengono visualizzate solo le sezioni di traccia del pacchetto. Per includere i processi esterni al pacchetto, imposta targetPackageOnly = false.

Per ulteriori informazioni sul monitoraggio, consulta la Panoramica del monitoraggio 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 viene suddivisa nei relativi componenti misurabili e le categorie non selezionate vengono aggiunte alla metrica "Non selezionata".

Queste metriche misurano il consumo a livello di sistema, non il consumo su base per app, e sono limitate ai dispositivi 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 distinguere il lavoro svolto da altre procedure 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.