Przechwytywanie danych analizy porównawczej

Dane to główny typ informacji wyodrębnionych z testów porównawczych. Są one przekazywane do funkcji measureRepeated jako List, co umożliwia określenie wielu mierzonych danych jednocześnie. Wymagany jest co najmniej 1 typ danych: testami porównawczymi.

Ten fragment kodu przechwytuje czas renderowania klatki i sekcję niestandardowego śledzenia dane:

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 możliwych do śledzenia bloków zdefiniowane w RecyclerView. kod źródłowy usługi createViewHolder() to przykład sposobu definiowania możliwych do śledzenia bloków we własnym zakresie w kodzie.

StartupTimingMetric TraceSectionMetric, Dostępne opcje: FrameTimingMetric i PowerMetric omówię 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 zdefiniowano wiele danych, w wynikach wyjściowych będą się one wyświetlać wszystkie.

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

Wskaźnik czasu uruchamiania

StartupTimingMetric rejestruje dane o czasie uruchamiania aplikacji za pomocą tych wartości:

  • 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, że jest w pełni narysowana, za pomocą metody reportFullyDrawn(). Pomiar zatrzymuje się po zakończeniu renderowania pierwszej klatki. po wywołaniu reportFullyDrawn() lub po jego zakończeniu. Ten pomiary mogą być niedostępne na Androidzie 10 (poziom interfejsu API 29) i starszych wersjach.

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 informacje na temat tego, co wpływa na czas uruchamiania aplikacji, zapoznaj się z sekcją Uruchamianie aplikacji .

Wyniki StartupTimingMetric
Rysunek 2. Wyniki: StartupTimingMetric.

Metryka czasu renderowania klatki

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

  • frameOverrunMs: czas, przez jaki dane klatka nie mieszczą się w terminie. Dodatnie liczby oznaczają porzucenie klatki i widoczne zakłócenia lub zacinanie się. 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 na utworzenie klatki, z CPU zarówno w wątku UI, jak i 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. Wyniki: FrameTimingMetric.

Wskaźnik sekcji TraceSection

TraceSectionMetric przechwytuje, ile razy sekcja logu czasu pasuje do podanej wartości sectionName oraz ile to czasu zajmuje. W tym czasie generuje minimalną, 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() lub ich wersjami asynchronicznymi. Zawsze wybiera pierwsze wystąpienie sekcji logu czasu zarejestrowane podczas pomiaru. Generuje tylko sekcje logu czasu z Twojego pakietu domyślnie; uwzględnij procesy spoza pakietu, ustaw targetPackageOnly = false

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

Wskaźnik sekcji TraceSection
Rysunek 4. Wyniki: TraceSectionMetric.

PowerMetrics

PowerMetric rejestruje zmianę mocy lub energii w czasie trwania testu w przypadku podanych kategorii mocy. Każda wybrana kategoria jest podzielona na wymierne podskładniki. Odznaczone kategorie są dodawane do „niewybranych” danych.

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 przesłanej w jednostce czasu przez jak długo trwa test w danej kategorii.

Kategorie obejmują:

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

W przypadku niektórych kategorii, takich jak CPU, podzielenie pracy według z innych procesów wykonywanych w Twojej aplikacji. Aby zminimalizować zakłócenia, usunąć lub ograniczyć niepotrzebne aplikacje i konta.

Wyniki z PowerMetric
Rysunek 5. Wyniki: PowerMetric.