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 List, co umożliwia 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ą wysyłane do Android Studio, tak jak na ilustracji 1. Jeśli zdefiniujesz kilka rodzajów danych, wszystkie zostaną połączone w wyniku.

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

StartupTimingMetric

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

  • timeToInitialDisplayMs: czas od momentu, w którym system otrzymuje intencję uruchomienia, do wyrenderowania pierwszej klatki miejsca docelowego Activity.
  • timeToFullDisplayMs: Czas od momentu, gdy system otrzyma intencję uruchomienia, do momentu, gdy aplikacja zgłosi, że jest w pełni narysowana, 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.

StartupTimingMetric zwraca wartości minimalną, medianę i maksymalną z iteracji uruchamiania. Aby ocenić poprawę czasu uruchamiania, skup się na wartościach mediany, 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 wyniku z grupy.

FrameTimingMetric

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

  • frameOverrunMs: czas, o który dana klatka przekroczyła swój termin. Wartości dodatnie wskazują 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 na Androidzie 12 (poziom interfejsu 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 danych FrameTimingMetric
Rysunek 3. FrameTimingMetric wyniku z grupy.

Wskaźnik sekcji TraceSection

TraceSectionMetric zlicza, ile razy występuje sekcja śladu pasująca do podanego ciągu znaków sectionName, oraz czas jej trwania. W przypadku czasu zwraca minimalny, średni i maksymalny czas w milisekundach. Sekcja logu czasu jest definiowana przez wywołanie funkcji trace(sectionName) lub kod między Trace.beginSection(sectionName) a Trace.endSection() lub ich warianty asynchroniczne. Zawsze wybiera pierwszą instancję sekcji przechwycenia zarejestrowanej podczas pomiaru. Domyślnie generuje 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.

Wskaźnik sekcji TraceSection
Rysunek 4. TraceSectionMetric wyniku z grupy.

PowerMetric

PowerMetric rejestruje zmianę mocy lub energii w trakcie 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 mierzą wykorzystanie w całym systemie, a nie w poszczególnych aplikacjach. Są one ograniczone do telefonów 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 wyniku z grupy.