Sebaiknya gunakan Macrobenchmark Jetpack untuk menguji performa aplikasi saat Profil Dasar Pengukuran diaktifkan, lalu bandingkan hasilnya dengan benchmark saat Profil Dasar Pengukuran dinonaktifkan. Dengan pendekatan ini, Anda dapat mengukur waktu startup aplikasi, baik waktu tampilan awal maupun penuh, atau performa rendering runtime untuk mengetahui apakah frame yang dihasilkan dapat menyebabkan jank.
Macrobenchmark memungkinkan Anda mengontrol kompilasi pra-pengukuran menggunakan
CompilationMode
API. Gunakan nilai CompilationMode
yang berbeda untuk membandingkan
performa dengan berbagai status kompilasi. Cuplikan kode berikut menunjukkan
cara menggunakan parameter CompilationMode
untuk mengukur manfaat Profil
Dasar Pengukuran:
@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() } ) { // Waits for the first rendered frame, which represents time to initial display. startActivityAndWait() // Waits for content to be visible, which represents time to fully drawn. device.wait(Until.hasObject(By.res("my-content")), 5_000) } }
Dalam screenshot berikut, Anda dapat melihat hasilnya langsung di Android Studio untuk aplikasi contoh Now in Android yang berjalan di Google Pixel 7. Hasilnya menunjukkan bahwa startup aplikasi berjalan paling cepat saat menggunakan Profil Dasar Pengukuran (229,0 ms), dibandingkan dengan tanpa kompilasi (324,8 ms).
Meskipun contoh sebelumnya menunjukkan hasil startup aplikasi yang diambil dengan
StartupTimingMetric
, ada metrik penting lainnya yang patut dipertimbangkan,
seperti FrameTimingMetric
. Untuk informasi lebih lanjut tentang semua jenis
metrik, lihat Merekam metrik Macrobenchmark.
Waktu hingga tampilan penuh
Contoh sebelumnya mengukur waktu hingga tampilan awal (TTID), yang merupakan waktu yang dibutuhkan aplikasi untuk menghasilkan frame pertamanya. Namun, hal ini tidak selalu mencerminkan waktu hingga pengguna dapat mulai berinteraksi dengan aplikasi Anda. Metrik waktu hingga tampilan penuh (TTFD) lebih berguna dalam mengukur dan mengoptimalkan jalur kode yang diperlukan agar memiliki status aplikasi yang sepenuhnya dapat digunakan.
Sebaiknya optimalkan untuk TTID dan TTFD karena keduanya penting. TTID yang rendah membantu pengguna melihat bahwa aplikasi benar-benar diluncurkan. Menjaga TTFD tetap singkat penting untuk membantu memastikan bahwa pengguna dapat berinteraksi dengan aplikasi dengan cepat.
Untuk mengetahui strategi pelaporan ketika UI aplikasi telah digambar sepenuhnya, lihat Meningkatkan akurasi waktu startup.
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- [Menulis Macrobenchmark][11]
- [Mengambil Metrik Macrobenchmark][12]
- [Analisis dan pengoptimalan startup aplikasi {:#app-startup-analysis-optimization}][13]