Przechwytywanie danych analizy porównawczej

Dane to główny typ informacji wyodrębnianych z testów porównawczych. Są one przekazywane do funkcji measureRepeated jako tablica List, co pozwala na określenie wielu mierzonych danych jednocześnie. Do uruchomienia testu porównawczego wymagany jest co najmniej 1 typ danych.

Ten fragment kodu rejestruje pomiary czasu klatek i metryki sekcji śledzenia niestandardowego:

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 z możliwością śledzenia zdefiniowanych w RecyclerView. Kod źródłowy metody createViewHolder() jest przykładem definiowania bloków umożliwiających śledzenie w Twoim kodzie.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric i PowerMetric są omawiane szczegółowo w dalszej części tego dokumentu.

Wyniki testów porównawczych są wyświetlane w Android Studio, jak pokazano na rysunku 1. Jeśli zdefiniujesz kilka rodzajów danych, wszystkie zostaną połączone w wyniku.

Wyniki funkcji TraceSectionMetric i FrameTimingMetric.
Rysunek 1. Wyniki TraceSectionMetricFrameTimingMetric.

StartupTimingMetric

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

  • timeToInitialDisplayMs: czas od momentu, gdy system otrzyma zamiar uruchomienia, do momentu renderowania pierwszego obrazu docelowego Activity.
  • timeToFullDisplayMs: Czas od momentu, gdy system otrzyma intencję uruchomienia, do momentu, gdy aplikacja zgłosi pełne wyświetlenie za pomocą metody reportFullyDrawn(). Pomiar kończy się po zakończeniu renderowania pierwszej klatki po wywołaniu funkcji reportFullyDrawn() lub zawierającym to wywołanie. Ta funkcja może nie być dostępna w Androidzie 10 (poziom API 29) i starszych.

Funkcja StartupTimingMetric zwraca wartości minimalną, medianę i maksymalną z iteracji uruchamiania. Aby ocenić poprawę czasu uruchamiania, skup się na wartościach medianowych, ponieważ zapewniają one najlepszy szacowany typowy czas uruchamiania. Więcej informacji o tym, co wpływa na czas uruchamiania aplikacji, znajdziesz w artykule Czas uruchamiania aplikacji.

Wyniki pomiaru StartupTiming
Rysunek 2. StartupTimingMetric wyników.

FrameTimingMetric

FrameTimingMetric przechwytuje informacje o czasie z ramek utworzonych przez benchmark, np. przewijania lub animacji, i wyprowadza te wartości:

  • frameOverrunMs: czas, o który dana klatka nie mieści się w ramach limitu. Wartości dodatnie wskazują na utratę klatki i widoczne zakłócenia lub zacinanie. Wartości ujemne wskazują, o ile szybciej klatka została wyrenderowana niż termin. Uwaga: ta funkcja jest dostępna tylko w Androidzie 12 (poziom API 31) i nowszych.
  • frameDurationCpuMs: czas potrzebny procesorowi na wygenerowanie ramki zarówno w wątku interfejsu użytkownika, jak i w wątku RenderThread.

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

Więcej informacji o identyfikowaniu i poprawianiu spowolnionych klatek znajdziesz w artykule Wydajne renderowanie.

Wyniki pomiaru FrameTimingMetric
Rysunek 3. FrameTimingMetric wyników.

TraceSectionMetric

TraceSectionMetric zapisywanie liczby wystąpień sekcji śladu pasującej do podanego ciągu znaków sectionName oraz czasu trwania tego wystąpienia. W przypadku czasu zwraca minimalny, średni 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() lub ich wersjami asynchronicznymi. Zawsze wybiera pierwszą instancję sekcji przechwycenia zarejestrowanej podczas pomiaru. Domyślnie zwraca tylko sekcje śledzenia z Twojego pakietu. Aby uwzględnić procesy spoza pakietu, ustaw opcję targetPackageOnly = false.

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

TraceSectionMetric
Rysunek 4. TraceSectionMetric wyniku.

PowerMetric

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

Te dane dotyczą zużycia w całym systemie, a nie zużycia 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 w czasie testu w danej kategorii.
  • energy<category>Uws: ilość energii przekształconej w jednostce czasu podczas trwania testu w danej kategorii.

Kategorie te to:

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

W przypadku niektórych kategorii, np. CPU, trudno jest oddzielić działanie innych procesów od działania Twojej aplikacji. Aby zminimalizować zakłócenia, usuń niepotrzebne aplikacje i konta lub ogranicz im dostęp.

Wyniki PowerMetric
Rysunek 5. PowerMetric wyników.