Przechwytywanie danych analizy porównawczej

Dane to główny rodzaj informacji wyodrębnianych z testów porównawczych. Są one przekazywane do funkcji measureRepeated jako List, co pozwala określić jednocześnie kilka mierzonych danych. Aby można było przeprowadzić test porównawczy, wymagany jest co najmniej 1 rodzaj danych.

Ten fragment kodu rejestruje dane dotyczące czasu trwania klatek i niestandardowych sekcji śledzenia:

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, które można śledzić i które są zdefiniowane w RecyclerView. Kod źródłowy metody createViewHolder() pokazuje, jak można zdefiniować bloki, które można śledzić, we własnym kodzie.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric, i PowerMetric są szczegółowo omówione w dalszej części tego dokumentu. Pełną listę danych znajdziesz w podklasach Metric.

Wyniki testów porównawczych są wyświetlane w Android Studio, jak pokazano na rysunku 1. Jeśli zdefiniowano kilka danych, wszystkie są łączone w danych wyjściowych.

Wyniki TraceSectionMetric i FrameTimingMetric.
Rysunek 1. Wyniki TraceSectionMetric i FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric rejestruje dane dotyczące czasu uruchamiania aplikacji z tymi wartościami:

  • timeToInitialDisplayMs: czas od momentu, gdy system otrzyma intencję uruchomienia, do momentu, gdy wyrenderuje pierwszą klatkę docelowego Activity.
  • timeToFullDisplayMs: czas od momentu, gdy system otrzyma intencję uruchomienia, do momentu, gdy aplikacja zgłosi pełne narysowanie za pomocą reportFullyDrawn() metody. Pomiar zatrzymuje się po zakończeniu renderowania pierwszej klatki po wywołaniu reportFullyDrawn() lub zawierającej to wywołanie. Ten pomiar może być niedostępny w Androidzie 10 (poziom API 29) i starszych wersjach.

StartupTimingMetric zwraca wartości minimalne, mediany i maksymalne z iteracji uruchamiania. Aby ocenić poprawę czasu uruchamiania, należy skupić się na medianach, ponieważ zapewniają one najlepsze oszacowanie typowego czasu uruchamiania. Więcej informacji o tym, co wpływa na czas uruchamiania aplikacji, znajdziesz w artykule Czas uruchamiania aplikacji.

Wyniki StartupTimingMetric
Rysunek 2. StartupTimingMetric wyniki.

FrameTimingMetric

FrameTimingMetric rejestruje informacje o czasie trwania klatek wygenerowanych przez test porównawczy, np. przewijanie lub animację, i zwraca te wartości:

  • frameOverrunMs: czas, o jaki dana klatka przekracza limit czasu. Liczby dodatnie wskazują na pominiętą klatkę i widoczne zacięcia lub przycięcia. Liczby ujemne wskazują, o ile klatka jest szybsza niż limit czasu. Uwaga: ta funkcja jest dostępna tylko w Androidzie 12 (poziom API 31) i nowszych wersjach.
  • frameDurationCpuMs: czas potrzebny na wygenerowanie klatki na procesorze zarówno w wątku UI, jak i w RenderThread.

Te pomiary są zbierane w rozkładzie 50, 90, 95 i 99 centyla.

Więcej informacji o tym, jak identyfikować i poprawiać wolne klatki, znajdziesz w artykule Wolne renderowanie.

Wyniki FrameTimingMetric
Rysunek 3. FrameTimingMetric wyniki.

TraceSectionMetric

TraceSectionMetric rejestruje liczbę wystąpień sekcji śledzenia pasujących do podanej wartości sectionName oraz czas ich trwania. W przypadku czasu zwraca minimalny, medianowy i maksymalny czas w milisekundach. Sekcja śledzenia jest definiowana albo przez wywołanie funkcji trace(sectionName) albo kod między Trace.beginSection(sectionName) a Trace.endSection() albo ich asynchroniczne warianty. Zawsze wybiera pierwsze wystąpienie sekcji śledzenia zarejestrowane podczas pomiaru. Domyślnie zwraca tylko sekcje śledzenia z Twojego pakietu. Aby uwzględnić procesy spoza pakietu, ustaw targetPackageOnly = false.

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

TraceSectionMetric
Rysunek 4. TraceSectionMetric wyniki.

PowerMetric

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

Te dane mierzą zużycie w całym systemie, a nie zużycie w poszczególnych aplikacjach, i są ograniczone do Pixela 6, Pixela 6 Pro i nowszych urządzeń:

  • power<category>Uw: ilość energii zużytej w czasie trwania testu w tej kategorii.
  • energy<category>Uws: ilość energii przesyłanej na jednostkę czasu w czasie trwania testu w tej kategorii.

Kategorie obejmują:

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

W przypadku niektórych kategorii, np. CPU, może być trudno oddzielić pracę wykonywaną przez inne procesy od pracy wykonywanej przez Twoją aplikację. Aby zminimalizować zakłócenia, usuń lub ogranicz niepotrzebne aplikacje i konta.

Wyniki PowerMetric
Rysunek 5. PowerMetric wyniki.