Macrobenchmark metriklerini yakalama

Metrikler, karşılaştırmalarınızdan çıkarılan temel bilgi türüdür. Bu değerler, measureRepeated işlevine List olarak iletilir. Bu sayede, aynı anda birden fazla ölçülen metrik belirtebilirsiniz. Karşılaştırmanın çalışması için en az bir metrik türü gereklidir.

Aşağıdaki kod snippet'i, Jetpack Compose tembel düzen arayüzü için kare zamanlaması ve özel izleme bölümü metriklerini yakalar:

@OptIn(ExperimentalMetricApi::class)
    @Test
    fun scrollComposeList() {
        benchmarkRule.measureRepeated(
            // [START_EXCLUDE]
            packageName = TARGET_PACKAGE,
            metrics = listOf(
                FrameTimingMetric(),
                // Measure power usage. This is supported on Pixel 6 and later.
                PowerMetric(PowerMetric.Type.Power(
                    mapOf(
                        PowerCategory.CPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.DISPLAY to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.GPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.NETWORK to PowerCategoryDisplayLevel.TOTAL,
                    )
                )),
                // Measure custom trace sections by name EntryRow (which is added to the EntryRow composable).
                // Mode.Sum measures combined duration and also how many times it occurred in the trace.
                // This way, you can estimate whether a composable recomposes more than it should.
                TraceSectionMetric("EntryRowCustomTrace", TraceSectionMetric.Mode.Sum),
                // This trace section takes into account the SQL wildcard character %,
                // which can find trace sections without the full name.
                // This way, you can measure composables produced by the composition tracing
                // and measure how long they took and how many times they recomposed.
                // WARNING: This metric only shows results when running with composition tracing, otherwise it won't be visible in the outputs.
                TraceSectionMetric("%EntryRow%", TraceSectionMetric.Mode.Sum),
            ),
            // Try switching to different compilation modes to see the effect
            // it has on frame timing metrics.
            compilationMode = CompilationMode.None(),
            startupMode = StartupMode.WARM, // restarts activity each iteration
            iterations = DEFAULT_ITERATIONS,
            // [END_EXCLUDE]
            setupBlock = {
                uiAutomator {
                    // Before starting to measure, navigate to the UI to be measured.
                    startIntent(Intent("$packageName.COMPOSE_ACTIVITY"))
                }
            }
        ) {
            uiAutomator {
                onElement { isScrollable }.fling(Direction.DOWN)
            }
        }
    }

Aşağıdaki örnekte EntryRowCustomTrace, standart Kotlin trace(sectionName) { ... } blok sarmalayıcısı kullanılarak composable öğe katmanları içinde tanımlanan özel bir izleme bölümünü temsil eder. TraceSectionMetric için veri sağlamak üzere hedef kullanıcı arayüzü bileşenlerini, uygulamanızın üretim kod tabanında standart Jetpack çalışma zamanı trace blok sarmalayıcısıyla sarmalamanız gerekir:

@Composable
private fun EntryRow(entry: Entry, modifier: Modifier = Modifier) = trace("EntryRowCustomTrace") {
    Card(modifier = modifier) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Text(
                text = entry.contents,
                modifier = Modifier
                    .padding(16.dp)
                    .wrapContentSize()
            )

            Spacer(modifier = Modifier.weight(1f))

            Checkbox(
                checked = false,
                onCheckedChange = {},
                modifier = Modifier.padding(16.dp)
            )
        }
    }
}

Karşılaştırma sonuçları, Şekil 1'de gösterildiği gibi doğrudan Android Studio'daki Benchmark terminal sekmesine verilir. Birden fazla metrik tanımlanırsa hesaplanan tüm veri noktaları özet penceresinde birleştirilir.

TraceSectionMetric ve FrameTimingMetric sonuçları.
Şekil 1. Modern bir Compose düzeni için TraceSectionMetric ve FrameTimingMetric'nin birleştirilmiş konsol sonuçları.

StartupTimingMetric, FrameTimingMetric, TraceSectionMetric ve PowerMetric ile ilgili ayrıntılı bilgileri aşağıda bulabilirsiniz. Kullanılabilir karşılaştırma metriklerinin tam listesi için API referansındaki Metric alt sınıflarına bakın.

StartupTimingMetric

StartupTimingMetric, uygulama başlatma zamanlaması metriklerini aşağıdaki değerlerle yakalar:

  • timeToInitialDisplayMs: Sistemin başlatma amaçlı bir istek almasıyla hedef ekranın ilk karesini oluşturması arasında geçen süre.
  • timeToFullDisplayMs: Sistem bir başlatma amaçlı isteği aldığında bu isteğin gönderilmesinden uygulamanın dahili platform raporlama mekanizmalarını kullanarak tamamen çizildiğini bildirmesine kadar geçen süre. Ölçüm, tamamen çizilmiş sinyali içeren veya bu sinyalden sonraki ilk karenin oluşturulması tamamlandığında durur.

StartupTimingMetric, başlangıç yinelemelerindeki minimum, medyan ve maksimum değerleri verir. Başlatma iyileştirmesini değerlendirmek için her zaman ortanca değerlere odaklanın. Çünkü bu değerler, tipik kullanıcı başlatma süreleriyle ilgili en iyi tahmini sağlar.

Compose'un öncelikli olduğu bir mimaride activity.reportFullyDrawn öğesini manuel olarak çağırmaya çalışmayın. Bunun yerine, ekran composable'larınızda Compose'a uygun asenkron yardımcı programlar ReportDrawn, ReportDrawnWhen veya ReportDrawnAfter'ı kullanarak asenkron ağ verilerinizin veya karmaşık kullanıcı arayüzü durumlarınızın oluşturulması tamamlandığında Macrobenchmark'a otomatik olarak sinyal gönderin.

Başlatma performansını analiz etme ve optimize etme hakkında daha fazla bilgi için Uygulama başlatma süresi başlıklı makaleyi inceleyin.

FrameTimingMetric

FrameTimingMetric, bir karşılaştırma yolculuğu tarafından üretilen karelerden (ör. bir listede kaydırma veya karmaşık bir kullanıcı arayüzü yerleşimi animasyonu) kesin zamanlama bilgilerini yakalar ve aşağıdaki teşhis değerlerini verir:

  • frameOverrunMs: Belirli bir karenin son tarihi kaçırdığı süre. Pozitif sayılar, görünür duraklama veya takılma ile birlikte kare düşmesini gösterir. Negatif sayılar, bir karenin alt sistem donanım son tarihine kıyasla ne kadar daha hızlı tamamlandığını gösterir. Not: Bu metrik yalnızca Android 12 (API düzeyi 31) ve sonraki sürümlerde kullanılabilir.
  • frameDurationCpuMs: Karenin, hem ana uygulama kullanıcı arayüzü iş parçacığında hem de Compose'da RenderThread CPU üzerinde etkin olarak üretildiği süre.

Bu ölçümler 50., 90., 95. ve 99. yüzdelik dilim dağılımı şeklinde toplanır:

frameDurationCpuMs P50 3.5, P90 6.0, P95 6.4, P99 11.0
frameOverrunMs P50 -11.6, P90 -7.2, P95 -7.1, P99 -1.2

Jetpack Compose düzen hiyerarşilerini optimize ederken en kötü performans gösteren karelerinize (P95 ve P99 sınırları) bakın. frameOverrunMs, yüksek yüzdelik dilimlerde pozitif tam sayılara yükselirse yeniden oluşturmaların, yoğun kaydırma animasyonları sırasında ana iş parçacığını durdurduğu anlamına gelir.

Yavaş kareleri belirleme ve çözme hakkında daha ayrıntılı bilgi için Jetpack Compose Performansı başlıklı makaleyi inceleyin.

TraceSectionMetric

TraceSectionMetric, belirli bir izleme bölümünün kaç kez gerçekleştiğini ve yürütülmesinin ne kadar sürdüğünü gösterir. Süre takibi için minimum, ortalama ve maksimum süreleri milisaniye cinsinden verir. Hedef izleme bölümü, trace(sectionName) işlev çağrısı veya Trace.beginSection(sectionName) ile Trace.endSection() arasındaki alt düzey blok sınırları ya da bunların eş zamansız varyantları tarafından tanımlanır.

EntryRowCustomTraceCount min 20.0, median 28.0, max 50.0
EntryRowCustomTraceSumMs min 34.9, median 44.4, max 66.6

Varsayılan olarak metrik, yalnızca doğrudan kendi uygulama paketi ikililerinizden derlenen izleme bölümlerini verir. Uygulamanızın paket sınırının dışından gelen işlemleri dahil etmek için targetPackageOnly = false özelliğini ayarlayın.

Jetpack Compose Runtime Tracing üzerinde çalışırken composition tracing'i etkinleştirerek sistem izleme grafiklerinizde manuel izleme sarmalayıcıları yazmadan tek tek composable işlevleri gösterebilirsiniz.

androidx.compose.runtime:runtime-tracing bağımlılığını hedef uygulamanıza eklemek manuel profil oluşturma izleri için yeterli olsa da bu izleri Macrobenchmark çalıştırması içinde programatik olarak yakalamak için karşılaştırma modülünüzde ek yapılandırma yapmanız gerekir.

Kurulum talimatlarının tamamı için Jetpack Macrobenchmark ile iz yakalama başlıklı makaleyi inceleyin.

PowerMetric

PowerMetric, Macrobenchmark çalıştırmanız süresince güç veya enerjideki değişimi yakalar. Seçilen her kategori, ölçülebilir donanım bileşenlerine ayrılırken seçilmeyen kategoriler "seçilmeyen" grubunda toplanır.

Donanım Gereksinimi: Bu metrikler, uygulama başına hesaplamalar yerine sistem genelindeki tüketimi ölçer. Bu nedenle, veri toplama işlemi fiziksel Google Pixel 6, Pixel 6 Pro ve daha yeni fiziksel cihazlarla sınırlıdır.

Metrik, kategori başına iki ölçüm verir:

  • power<category>Uw: Bu kategorideki testiniz süresince tüketilen güç miktarı (mikrovat cinsinden ölçülür).
  • energy<category>Uws: Bu kategorideki testiniz süresince birim zaman başına aktarılan toplam enerji miktarı (mikrovat-saniye cinsinden ölçülür).

Kategoriler şunlardır:

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

CPU gibi bazı kategorilerde, diğer işlemlerin yaptığı işi kendi uygulamanızın yaptığı işten ayırmak zor olabilir. Girişimi en aza indirmek için gereksiz uygulamaları ve hesapları kaldırın veya kısıtlayın.

powerCategoryCpuUw min 300.2, median 346.1, max 519.6
powerCategoryDisplayUw min 319.8, median 325.8, max 329.7
powerCategoryGpuUw min 18.8, median 23.3, max 36.9
powerCategoryNetworkUw min 97.3, median 123.3, max 681.3
powerTotalUw min 1234.8, median 1316.6, max 2112.4
powerUnselectedUw       min  483.3,  median  512.6,  max  561.7

Temel alt sistemleri analiz etme

PowerMetric, sağlanan güç kategorileri için testiniz süresince güç veya enerjideki değişimi gösterir. Seçtiğiniz her kategori, ölçülebilir alt bileşenlerine ayrılır ve seçilmeyen kategoriler "seçilmeyen" metriğine eklenir.

Terminal çıkışları, istediğiniz yapılandırmayla eşlenir:

  • powerCategoryCpuUw: Testiniz süresince CPU tarafından tüketilen güç miktarı.
  • powerCategoryGpuUw: Testiniz süresince GPU tarafından tüketilen güç miktarı.
  • powerUnselectedUw: Başlatma haritanızda açıkça istenmeyen tüm kullanılabilir donanım kategorileri tarafından tüketilen toplam güç.

Çalışma sırasında donanım kanallarında düzensiz veri artışlarını önlemek için ekran parlaklığını sabit bir değere kilitleyin, cihaz sıcaklığını sabit tutun ve Macrobenchmark döngüsünü başlatmadan önce rekabet eden arka plan işlemlerini kapatın.

Ek kaynaklar

İçeriği görüntüleme