Acquisisci le metriche di Macrobenchmark

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

Il seguente snippet di codice acquisisce le metriche relative ai tempi 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 per il createViewHolder() metodo è 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 visualizzati in Android Studio, come mostrato nella Figura 1. Se vengono definite più metriche, vengono combinate tutte nell'output.

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

StartupTimingMetric

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

  • timeToInitialDisplayMs: il tempo trascorso da quando il sistema riceve un intent di avvio a quando esegue il rendering del primo frame della destinazione Activity.
  • timeToFullDisplayMs: il tempo trascorso da quando il sistema riceve un intent di avvio a quando l'app segnala il rendering completo utilizzando il reportFullyDrawn() metodo. 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 minimi, mediani e massimi 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 saperne di più su cosa contribuisce al tempo di avvio dell'app, consulta Tempo di avvio dell'app.

Risultati di StartupTimingMetric
Figura 2. Risultati di StartupTimingMetric.

FrameTimingMetric

FrameTimingMetric acquisisce le informazioni sui tempi dei frame prodotti da un benchmark, ad esempio uno scorrimento o un'animazione, e restituisce i seguenti valori:

  • frameOverrunMs: il tempo di cui un determinato frame supera la scadenza. I numeri positivi indicano un frame eliminato e un'interruzione o un'esitazione visibile. I numeri negativi indicano la velocità di un frame rispetto alla scadenza. Nota: questa funzionalità è disponibile solo su Android 12 (livello API 31) e versioni successive.
  • frameDurationCpuMs: il tempo impiegato dal frame per essere prodotto 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. Risultati di FrameTimingMetric.

TraceSectionMetric

TraceSectionMetric acquisisce il numero di volte in cui si verifica una sezione di traccia corrispondente a sectionName fornito e il tempo impiegato. Per il tempo, restituisce i tempi minimi, mediani e massimi in millisecondi. La sezione di traccia è definita either dalla chiamata di funzione trace(sectionName) o dal codice tra Trace.beginSection(sectionName) e Trace.endSection() o dalle relative 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 tuo pacchetto; per includere i processi esterni al pacchetto, imposta targetPackageOnly = false.

Per saperne di più sulla traccia, consulta Panoramica della traccia di sistema e Definire eventi personalizzati.

TraceSectionMetric
Figura 4. Risultati di TraceSectionMetric.

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 sottocomponenti misurabili e le categorie non selezionate vengono aggiunte alla metrica "non selezionata".

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

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

Le categorie includono quanto segue:

  • 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 le interferenze, rimuovi o limita le app e gli account non necessari.

Risultati di PowerMetric
Figura 5. Risultati.
PowerMetric