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 wiele mierzonych wartości. Aby można było uruchomić test porównawczy, wymagany jest co najmniej 1 typ danych.

Ten fragment kodu rejestruje dane o czasie trwania klatek i niestandardowej 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 CreateViewRV OnBindView to identyfikatory bloków śledzenia zdefiniowane w RecyclerView. Kod źródłowy metody createViewHolder() jest przykładem tego, jak możesz zdefiniować bloki, które można śledzić, we własnym kodzie.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetricPowerMetric zostaną 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 Androidzie Studio, jak pokazano na rysunku 1. Jeśli zdefiniowano wiele rodzajów danych, wszystkie zostaną połączone w danych wyjściowych.

Wyniki TraceSectionMetric i FrameTimingMetric.
Rysunek 1. Wyniki TraceSectionMetricFrameTimingMetric.

StartupTimingMetric

StartupTimingMetric rejestruje dane o czasie uruchamiania aplikacji z tymi wartościami:

  • timeToInitialDisplayMs: czas od momentu, w którym system otrzyma intencję uruchomienia, do momentu, w którym wyrenderuje pierwszą klatkę miejsca docelowegoActivity.
  • timeToFullDisplayMs: czas od momentu, w którym system otrzyma intencję uruchomienia, do momentu, w którym aplikacja zgłosi pełne wyrenderowanie za pomocą metody reportFullyDrawn(). Pomiar kończy się po wyrenderowaniu pierwszej klatki po wywołaniu funkcji reportFullyDrawn() lub zawierającej to wywołanie. Ten pomiar może być niedostępny na Androidzie 10 (poziom API 29) i starszych.

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

Wyniki StartupTimingMetric
Rysunek 2. StartupTimingMetricwyniki
.

FrameTimingMetric

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

  • frameOverrunMs: o ile czasu dana klatka przekracza termin. Liczby dodatnie oznaczają pominiętą klatkę i widoczne zacięcia lub przeskoki. Liczby ujemne wskazują, o ile klatka jest szybsza niż termin. Uwaga: ta funkcja jest dostępna tylko na Androidzie 12 (poziom API 31) i nowszym.
  • frameDurationCpuMs: czas potrzebny na wygenerowanie klatki na procesorze zarówno w wątku interfejsu, 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ć spowolnione klatki, znajdziesz w artykule Spowolnione renderowanie.

Wyniki FrameTimingMetric
Rysunek 3. FrameTimingMetricwyniki
.

TraceSectionMetric

TraceSectionMetric rejestruje liczbę wystąpień sekcji śladu pasującej do podanego warunku sectionName oraz czas jej trwania. W przypadku czasu podaje minimalny, medianę i maksymalny czas w milisekundach. Sekcja śledzenia jest definiowana przez wywołanie funkcji trace(sectionName) lub kod między Trace.beginSection(sectionName) a Trace.endSection() albo ich asynchroniczne warianty. Zawsze wybiera pierwszą instancję sekcji śladu zarejestrowaną podczas pomiaru. Domyślnie wyświetla tylko sekcje śledzenia z pakietu. Aby uwzględnić procesy spoza pakietu, ustaw targetPackageOnly = false.

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

TraceSectionMetric
Rysunek 4. TraceSectionMetricwyniki
.

PowerMetric

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

Te dane mierzą zużycie w całym systemie, a nie w poszczególnych aplikacjach. Są one dostępne tylko na urządzeniach Pixel 6, Pixel 6 Pro i nowszych:

  • power<category>Uw: ilość energii zużytej podczas testu w tej kategorii.
  • energy<category>Uws: ilość energii przeniesionej w jednostce czasu w trakcie 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 odróżnić pracę wykonaną przez inne procesy od pracy wykonanej przez Twoją aplikację. Aby zminimalizować zakłócenia, usuń lub ogranicz niepotrzebne aplikacje i konta.

Wyniki PowerMetric
Rysunek 5. PowerMetricwyniki
.