Membandingkan metrik Compose dan View

Jetpack Compose mempercepat pengembangan UI dan meningkatkan Android pengembangan. Namun, pertimbangkan bagaimana menambahkan Compose ke aplikasi yang sudah ada dapat memengaruhi metrik seperti ukuran APK aplikasi, build, dan performa runtime.

Ukuran APK dan waktu build

Bagian ini membahas dampak terhadap ukuran APK dan waktu build dengan melihat Aplikasi contoh Sunflower—aplikasi yang menunjukkan praktik terbaik saat memigrasikan aplikasi berbasis View ke Compose.

Ukuran APK

Menambahkan library ke project Anda akan meningkatkan ukuran APK-nya. Hasil berikut untuk APK rilis yang diminifikasi dari setiap project dengan resource dan kode penyingkatan diaktifkan, menggunakan mode penuh R8, dan diukur menggunakan APK Analyzer.

Hanya lihat Tampilan Campuran dan Compose Khusus Compose
Ukuran download 2.252 KB 3.034 KB 2.966 KB

Saat pertama kali menambahkan Compose ke Sunflower, ukuran APK meningkat dari 2.252 KB menjadi 3.034 KB—peningkatan 782 KB. APK yang dihasilkan terdiri dari build UI dengan campuran View dan Compose. Peningkatan ini diperkirakan sebagai tambahan dependensi telah ditambahkan ke Sunflower.

Sebaliknya, saat Sunflower dimigrasikan ke aplikasi khusus Compose, ukuran APK menurun dari 3.034 KB menjadi 2.966 KB—penurunan sebesar 68 KB. Penurunan ini karena untuk menghapus dependensi View yang tidak digunakan, seperti AppCompat dan ConstraintLayout.

Waktu build

Menambahkan Compose akan meningkatkan waktu build aplikasi sebagai compiler Compose memproses composable di aplikasi Anda. Hasil berikut diperoleh menggunakan alat gradle-profiler mandiri, yang menjalankan build beberapa kali sehingga waktu build rata-rata bisa diperoleh untuk durasi build debug Bunga matahari:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Hanya lihat Tampilan Campuran dan Compose Khusus Compose
Waktu build rata-rata 299,47 md 399,09 md 342,16 md

Saat pertama kali menambahkan Compose ke Sunflower, waktu build rata-rata meningkat dari 299 md menjadi 399 md—peningkatan 100 md. Durasi ini disebabkan oleh compiler Compose melakukan tugas tambahan untuk mengubah kode Compose yang ditentukan dalam project.

Sebaliknya, waktu build rata-rata turun menjadi 342 milidetik, penurunan sebesar 57 milidetik, jika Migrasi Sunflower ke Compose selesai. Pengurangan ini dapat diatribusikan beberapa faktor yang secara kolektif mengurangi waktu build, seperti menghapus data binding, memigrasikan dependensi yang menggunakan kapt ke KSP, dan mengupdate beberapa dependensi ke versi terbarunya.

Ringkasan

Mengadopsi Compose akan meningkatkan ukuran APK aplikasi Anda secara efektif dan juga meningkatkan performa waktu build aplikasi karena proses kompilasi dari kode Compose. Namun demikian, kompromi ini perlu dipertimbangkan manfaat Compose, terutama seputar peningkatan produktivitas developer saat mengadopsi Compose. Misalnya, tim Play Store menemukan bahwa penulisan UI memerlukan lebih sedikit kode, terkadang hingga 50%, sehingga meningkatkan produktivitas dan pengelolaan kode.

Anda dapat membaca studi kasus lainnya di Mengadopsi Compose untuk Tim.

Performa Runtime

Bagian ini membahas topik terkait performa runtime di Jetpack Compose untuk membantu memahami perbandingan Jetpack Compose dengan performa sistem View, dan cara mengukurnya.

Rekomposisi cerdas

Saat sebagian UI tidak valid, Compose akan mencoba merekomposisi hanya bagian-bagian yang perlu diperbarui. Baca selengkapnya tentang hal ini dalam Siklus proses composable dan Jetpack Compose fase-fase ini.

Profil Dasar Pengukuran

Profil Dasar Pengukuran adalah cara yang sangat baik untuk mempercepat perjalanan pengguna pada umumnya. Menyertakan Dasar Pengukuran Profil di aplikasi Anda dapat meningkatkan kecepatan eksekusi kode sekitar 30% sejak diluncurkan dengan menghindari langkah interpretasi dan kompilasi tepat waktu (JIT) untuk jalur kode yang disertakan.

Library Jetpack Compose menyertakan Profil Dasar Pengukurannya sendiri dan Anda otomatis mendapatkan pengoptimalan ini saat Anda menggunakan Compose di aplikasi. Namun, pengoptimalan ini hanya memengaruhi jalur kode dalam library Compose, jadi kami sebaiknya Anda menambahkan Profil Dasar Pengukuran ke aplikasi untuk mencakup jalur kode di luar Compose.

Perbandingan dengan sistem View

Jetpack Compose memiliki banyak peningkatan dibandingkan sistem View. Peningkatan ini dijelaskan di bagian berikut.

Semuanya memperluas View

Setiap View yang digambar pada layar, seperti TextView, Button, atau ImageView, memerlukan alokasi memori, pelacakan status eksplisit, dan berbagai callback untuk mendukung semua penggunaan kasus. Selain itu, pemilik View kustom perlu untuk menerapkan logika eksplisit guna mencegah penggambaran ulang saat tidak dilakukan yang diperlukan—misalnya, untuk pemrosesan data berulang.

Jetpack Compose menangani masalah ini dengan beberapa cara. Compose tidak memiliki teks objek yang dapat diperbarui untuk menggambar tampilan. Elemen UI adalah fungsi composable sederhana yang informasinya ditulis ke komposisi dengan cara yang dapat diputar ulang. Hal ini membantu mengurangi pelacakan status, alokasi memori, dan callback eksplisit hanya ke composable yang memerlukan fitur tersebut, bukan memerlukannya oleh semua ekstensi dari jenis View tertentu.

Selain itu, Compose menyediakan rekomposisi cerdas, memutar ulang hasil yang digambar sebelumnya jika Anda tidak perlu melakukan perubahan.

Meneruskan beberapa tata letak

ViewGroup tradisional memiliki banyak keekspresifan dalam ukuran dan tata letaknya. API yang membuatnya rentan terhadap beberapa penerusan tata letak. Beberapa penerusan tata letak ini dapat menyebabkan tugas eksponensial jika dilakukan pada titik bertingkat tertentu dalam hierarki tampilan.

Jetpack Compose menerapkan satu penerusan tata letak untuk semua composable tata letak melalui kontrak API-nya. Hal ini memungkinkan Compose secara efisien menangani hierarki UI yang dalam. Jika beberapa pengukuran diperlukan, Compose memiliki pengukuran intrinsik.

Performa startup View

Sistem View perlu meng-inflate tata letak XML saat pertama kali menampilkan tata letak tertentu. Biaya ini disimpan di Jetpack Compose karena tata letak ditulis dalam Kotlin dan dikompilasi seperti aplikasi Anda lainnya.

Compose Tolok Ukur

Pada Jetpack Compose 1.0, ada perbedaan penting antara performa aplikasi dalam mode debug dan release. Untuk pengaturan waktu representatif, selalu gunakan build release saat membuat profil aplikasi, bukan debug.

Untuk memeriksa performa kode Jetpack Compose, Anda dapat menggunakan Library Jetpack Macrobenchmark. Untuk mempelajari cara untuk menggunakannya dengan Jetpack Compose, lihat Project MacrobenchmarkSample.

Tim Jetpack Compose juga menggunakan Macrobenchmark untuk menangkap regresi yang hal-hal yang bisa terjadi. Misalnya, lihat tolok ukur untuk kolom lambat dan dasbornya untuk melacak regresi.

Penginstalan profil Compose

Karena Jetpack Compose adalah library yang tidak dipaketkan, library ini tidak mendapatkan manfaat dari Zygote yang melakukan pramuat sistem View Class dan drawable Toolkit UI. Jetpack Compose 1.0 menggunakan profil penginstalan untuk build release. Penginstal profil mengizinkan aplikasi menentukan kode penting untuk kompilasi {i>front-of-time<i} (AOT) pada waktu instalasi. Compose mengirimkan aturan penginstalan profil yang mengurangi waktu startup dan jank di aplikasi Compose.