Przechwytywanie danych analizy porównawczej

Pojęcia i implementacja w Jetpack Compose

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 rodzajów danych. Aby można było uruchomić test porównawczy, wymagany jest co najmniej 1 typ wskaźnika.

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 śledzenia we własnym kodzie.

StartupTimingMetric, TraceSectionMetricFrameTimingMetric zostaną szczegółowo omówione w dalszej części tego dokumentu. Pełną listę danych znajdziesz w podklasach Metric.

Wyniki testu porównawczego są wyświetlane w Androidzie Studio, jak pokazano na ilustracji 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 zakończeniu renderowania 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 wersjach.

StartupTimingMetric zwraca wartości minimalną, medianę i maksymalną z iteracji początkowych. Aby ocenić poprawę czasu uruchamiania, zawsze skupiaj się na wartościach mediany, ponieważ zapewniają one najlepsze oszacowanie typowych czasów uruchamiania u użytkowników. Więcej informacji o tym, co wpływa na czas uruchomienia aplikacji, znajdziesz w sekcji Czas uruchomienia aplikacji.

Wyniki StartupTimingMetric
Rysunek 2. StartupTimingMetric wyników.

FrameTimingMetric

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

  • frameOverrunMs: o ile dana ramka przekracza termin. Liczby dodatnie oznaczają pominiętą klatkę, której towarzyszy widoczne szarpanie lub zacinanie się obrazu. Liczby ujemne wskazują, o ile szybciej klatka została wyrenderowana w porównaniu z terminem sprzętowym podsystemu. Uwaga: ten rodzaj danych jest dostępny tylko na urządzeniach z Androidem 12 (poziom API 31) lub nowszym.
  • frameDurationCpuMs: czas potrzebny na wygenerowanie klatki na procesorze zarówno w wątku UI, 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. FrameTimingMetric wyników.

TraceSectionMetric

TraceSectionMetric rejestruje liczbę wystąpień określonej sekcji śledzenia i bezwzględny czas jej wykonania. W przypadku śledzenia czasu podaje minimalny, średni i maksymalny czas w milisekundach.

Sekcja śladu docelowego jest definiowana przez wywołanie funkcji trace(sectionName) lub granice bloków niższego poziomu między Trace.beginSection(sectionName) a Trace.endSection() albo ich warianty asynchroniczne. Zawsze wybiera pierwsze wystąpienie sekcji śladu zarejestrowane 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. TraceSectionMetric wyników.