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 umożliwia jednoczesne określanie wielu mierzonych danych. Aby można było uruchomić test porównawczy, wymagany jest co najmniej 1 rodzaj 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, które można śledzić i które są zdefiniowane w RecyclerView. Kod źródłowy metody createViewHolder() jest przykładem tego, jak można 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 w niej. 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 początkowych. 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 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 w wątku interfejsu 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 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
.