Macrobenchmark kitaplığıyla Karşılaştırma Referans Profilleri

Temel Profiller etkinleştirildiğinde uygulamanın nasıl performans gösterdiğini test etmek için Jetpack Macrobenchmark'ı kullanmanızı ve ardından bu sonuçları Temel Profiller devre dışı bırakıldığında elde edilen karşılaştırma sonuçlarıyla karşılaştırmanızı öneririz. Bu yaklaşımla, uygulama başlatma süresini (hem ilk hem de tam görüntüleme süresi) veya çalışma zamanı oluşturma performansını ölçerek üretilen karelerin takılmaya neden olup olmayacağını görebilirsiniz.

Makro karşılaştırmalar, CompilationMode API'yi kullanarak ölçüm öncesi derlemeyi kontrol etmenize olanak tanır. Performansı farklı derleme durumlarıyla karşılaştırmak için farklı CompilationMode değerleri kullanın. Aşağıdaki kod snippet'inde, temel profillerin avantajını ölçmek için CompilationMode parametresinin nasıl kullanılacağı gösterilmektedir:

@RunWith(AndroidJUnit4ClassRunner::class)
class ColdStartupBenchmark {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    // No ahead-of-time (AOT) compilation at all. Represents performance of a
    // fresh install on a user's device if you don't enable Baseline Profiles—
    // generally the worst case performance.
    @Test
    fun startupNoCompilation() = startup(CompilationMode.None())

    // Partial pre-compilation with Baseline Profiles. Represents performance of
    // a fresh install on a user's device.
    @Test
    fun startupPartialWithBaselineProfiles() =
        startup(CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require))

    // Partial pre-compilation with some just-in-time (JIT) compilation.
    // Represents performance after some app usage.
    @Test
    fun startupPartialCompilation() = startup(
        CompilationMode.Partial(
            baselineProfileMode = BaselineProfileMode.Disable,
            warmupIteration = 3
        )
    )

    // Full pre-compilation. Generally not representative of real user
    // experience, but can yield more stable performance metrics by removing
    // noise from JIT compilation within benchmark runs.
    @Test
    fun startupFullCompilation() = startup(CompilationMode.Full())

    private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated(
        packageName = "com.example.macrobenchmark.target",
        metrics = listOf(StartupTimingMetric()),
        compilationMode = compilationMode,
        iterations = 10,
        startupMode = StartupMode.COLD,
        setupBlock = {
            pressHome()
        }
    ) {
        uiAutomator {
            startApp(packageName)
            onElement(5_000) { viewIdResourceName == "my-content"}
        }
    }
}

Aşağıdaki ekran görüntüsünde, Google Pixel 7'de çalıştırılan Now in Android örnek uygulamasının sonuçlarını doğrudan Android Studio'da görebilirsiniz. Sonuçlar, uygulama başlatma süresinin, derleme yapılmadığı duruma (324,8 ms) kıyasla Temel Profiller kullanıldığında (229,0 ms) en hızlı olduğunu gösteriyor.

ColdstartupBenchmark sonuçları
Şekil 1. ColdStartupBenchmark sonuçları: Derleme olmadan (324 ms), tam derleme (315 ms), kısmi derleme (312 ms) ve Baseline Profiles (229 ms) için ilk görüntüleme süresi gösteriliyor.

Önceki örnekte StartupTimingMetric ile yakalanan uygulama başlatma sonuçları gösterilse de dikkate alınması gereken başka önemli metrikler de vardır (ör. FrameTimingMetric). Tüm metrik türleri hakkında daha fazla bilgi için Makro karşılaştırma metriklerini yakalama başlıklı makaleyi inceleyin.

Tam görüntüleme süresi

Önceki örnekte, uygulamanın ilk karesini oluşturması için geçen süre olan ilk görüntüleme süresi (TTID) ölçülmektedir. Ancak bu, kullanıcının uygulamanızla etkileşime geçebileceği süreyi yansıtmayabilir. Tam görüntüleme süresi (TTFD) metriği, tamamen kullanılabilir bir uygulama durumu için gerekli kod yollarını ölçme ve optimize etme konusunda daha faydalıdır.

Her ikisi de önemli olduğundan hem TTID hem de TTFD için optimizasyon yapmanızı öneririz. Düşük bir TTID, kullanıcının uygulamanın gerçekten başlatıldığını görmesine yardımcı olur. TTFD'yi kısa tutmak, kullanıcının uygulamayla hızlı bir şekilde etkileşime geçebilmesini sağlamak açısından önemlidir.

Uygulama kullanıcı arayüzü tamamen çizildiğinde raporlama stratejileri için Başlatma zamanlamasının doğruluğunu artırma bölümüne bakın.

  • Not: JavaScript devre dışı bırakıldığında bağlantı metni gösterilir.
  • [Makro karşılaştırma yazma][11]
  • [Macrobenchmark metriklerini yakalama][12]
  • UI Automator ile otomatik testler yazma
  • [Uygulama başlatma analizi ve optimizasyonu {:#app-startup-analysis-optimization}][14]