Przechwytywanie danych analizy porównawczej

Dane to główny typ informacji wyodrębnionych z testów porównawczych. Są one przekazywane do funkcji measureRepeated jako List, co umożliwia określenie wielu zmierzonych danych naraz. Do przeprowadzenia analizy porównawczej wymagany jest co najmniej 1 typ danych.

Ten fragment kodu rejestruje czas renderowania klatki i dane niestandardowe sekcji logu czasu:

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
    // ...
);

W tym przykładzie RV CreateView i RV OnBindView to identyfikatory bloków możliwych do śledzenia, które są zdefiniowane w RecyclerView. Kod źródłowy metody createViewHolder() to przykład sposobu definiowania bloków możliwych do śledzenia w swoim kodzie.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric i PowerMetric zostały szczegółowo omówione w dalszej części tego dokumentu.

Wyniki testów porównawczych są przesyłane do Android Studio, jak widać na ilustracji 1. Jeśli zdefiniujesz wiele rodzajów danych, w danych wyjściowych będą one łączone.

Wyniki parametrów TraceSectionMetric i FrameTimingMetric.
Rysunek 1. Wyniki właściwości TraceSectionMetric i FrameTimingMetric.

Metryka czasu uruchamiania

StartupTimingMetric rejestruje wskaźniki czasu uruchamiania aplikacji z tymi wartościami:

  • timeToInitialDisplayMs: czas od momentu otrzymania przez system intencji uruchomienia do wyrenderowania pierwszej klatki w miejscu docelowym Activity.
  • timeToFullDisplayMs: czas od momentu otrzymania przez system zamiaru wprowadzenia na rynek do momentu, gdy aplikacja została w pełni pobrana przy użyciu metody reportFullyDrawn(). Pomiar zostaje zatrzymany po zakończeniu renderowania pierwszej klatki po wywołaniu reportFullyDrawn() lub po nim. Ten pomiar może nie być dostępny na Androidzie 10 (poziom interfejsu API 29) i starszych.

StartupTimingMetric podaje na wyjściu wartości minimalną, medianę i maksymalną z iteracji początkowych. Aby ocenić efektywność startową, skup się na wartościach mediany, ponieważ stanowią one najlepsze oszacowanie typowego czasu uruchamiania. Więcej informacji o tym, co wpływa na czas uruchamiania aplikacji, znajdziesz w artykule Czas uruchomienia aplikacji.

Wyniki StartupTimingMetric
Rysunek 2. Wyniki: StartupTimingMetric.

Dane czasu klatek

FrameTimingMetric przechwytuje informacje o czasie pochodzące z klatek utworzonych w ramach testu porównawczego (np. podczas przewijania lub animacji) i zwraca te wartości:

  • frameOverrunMs: czas, o który mija termin określonej klatki. Wartości dodatnie oznaczają, że ramka została pominięta oraz widoczne zacinanie się lub zacinanie. Liczby ujemne wskazują, o ile szybciej klatek mieści się w terminie. Uwaga: ta funkcja jest dostępna tylko na Androidzie 12 (poziom interfejsu API 31) i nowszych.
  • frameDurationCpuMs: czas potrzebny na utworzenie klatki przez procesor zarówno w wątku UI, jak i w RenderThread.

Dane pomiarowe są zbierane w rozkładzie 50, 90, 95 i 99 percentyla.

Więcej informacji o rozpoznawaniu i ulepszaniu spowolnionych klatek znajdziesz w artykule Powolne renderowanie.

Wyniki FrameTimingMetric
Rysunek 3. Wyniki: FrameTimingMetric.

Wskaźnik sekcji TraceSection

TraceSectionMetric rejestruje, ile razy sekcja śledzenia pasuje do podanej wartości sectionName, oraz ile czasu to zajmuje. Na potrzeby czasu podaje minimalną, medianę i maksymalny czas w milisekundach. Sekcja śledzenia jest definiowana przez wywołanie funkcji trace(sectionName) lub kod między elementami Trace.beginSection(sectionName) a Trace.endSection() lub ich wersjami asynchronicznymi. Zawsze wybiera pierwsze wystąpienie sekcji logu czasu zarejestrowanej podczas pomiaru. Domyślnie generuje tylko sekcje śledzenia z pakietu. Aby uwzględnić procesy spoza pakietu, ustaw parametr targetPackageOnly = false.

Więcej informacji o śledzeniu znajdziesz w artykułach Omówienie śledzenia systemu i Definiowanie zdarzeń niestandardowych.

Wskaźnik sekcji TraceSection
Rysunek 4. Wyniki: TraceSectionMetric.

PowerMetric

PowerMetric rejestruje zmianę mocy lub energii w czasie trwania testu dla podanych kategorii mocy. Każda wybrana kategoria jest dzielona na wymierne podkomponenty, a niewybrane kategorie są dodawane do „niewybranych” danych.

Te dane mierzą wykorzystanie w całym systemie, a nie na poziomie aplikacji. Są one ograniczone do urządzeń Pixel 6, Pixel 6 Pro i nowszych:

  • power<category>Uw: ilość energii zużytej w czasie trwania testu w tej kategorii.
  • energy<category>Uws: ilość energii przekazywana w jednostce czasu podczas trwania testu w tej kategorii.

Dostępne są następujące kategorie:

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

W przypadku niektórych kategorii, takich jak CPU, oddzielenie zadania wykonywanego przez inne procesy od czynności wykonywanych przez Twoją aplikację może być trudne. Aby zminimalizować zakłócenia, usuń lub ogranicz niepotrzebne aplikacje i konta.

Wyniki PowerMetric
Rysunek 5. Wyniki: PowerMetric.