Jetpack Compose bertujuan untuk memberikan performa yang luar biasa. Halaman ini menunjukkan cara menulis dan mengonfigurasi aplikasi untuk mendapatkan performa terbaik, dan menunjukkan beberapa pola yang harus dihindari.
Sebelum membaca ini, Anda mungkin ingin memahami konsep Compose inti dalam Paradigma Compose.
Mengonfigurasi aplikasi Anda dengan benar
Jika aplikasi Anda berperforma buruk, mungkin ada masalah konfigurasi. Langkah pertama yang baik adalah memeriksa opsi konfigurasi berikut.
Mem-build aplikasi dalam mode rilis dan menggunakan R8
Jika menemukan masalah performa, pastikan Anda mencoba menjalankan aplikasi dalam mode rilis. Mode debug berguna untuk menemukan banyak masalah, tetapi dapat menimbulkan biaya performa yang signifikan dan dapat menyulitkan untuk mendeteksi masalah kode lain yang mungkin menurunkan performa. Anda juga harus menggunakan compiler R8 untuk menghapus kode yang tidak perlu dari aplikasi Anda. Secara default, mem-build dalam mode rilis akan otomatis menggunakan compiler R8.
Menggunakan profil dasar pengukuran
Compose didistribusikan sebagai library, bukan menjadi bagian dari platform Android. Pendekatan ini memungkinkan kita mengupdate Compose secara berkala dan mendukung versi Android yang lebih lama. Namun, mendistribusikan Compose sebagai library akan menimbulkan biaya. Kode platform Android sudah dikompilasi dan diinstal di perangkat. Di sisi lain, library harus dimuat saat aplikasi diluncurkan, dan diinterpretasikan tepat pada waktunya saat fungsionalitas diperlukan. Hal ini dapat memperlambat aplikasi saat memulai, dan setiap kali aplikasi menggunakan fitur library untuk pertama kalinya.
Anda dapat meningkatkan performa dengan menentukan profil dasar pengukuran. Profil ini menentukan class dan metode yang diperlukan dalam perjalanan pengguna yang penting, serta didistribusikan bersama APK aplikasi. Selama penginstalan aplikasi, ART mengompilasi kode penting tersebut sebelum waktunya, sehingga siap digunakan saat aplikasi diluncurkan.
Tidak selalu mudah untuk menentukan profil dasar pengukuran yang baik, oleh karena itu, Compose mengirimkannya secara default. Anda mungkin tidak perlu melakukan pekerjaan apa pun untuk melihat manfaat ini. Namun, jika memilih untuk menentukan profil sendiri, Anda dapat membuat profil yang tidak benar-benar meningkatkan performa aplikasi. Anda harus menguji profil untuk memverifikasi bahwa profil tersebut membantu. Cara yang baik untuk melakukannya adalah menulis pengujian Macrobenchmark untuk aplikasi Anda, dan memeriksa hasil pengujian saat menulis dan merevisi profil dasar pengukuran. Untuk contoh cara menulis pengujian Macrobenchmark untuk UI Compose, lihat contoh Macrobenchmark Compose.
Untuk mengetahui uraian mendetail efek mode rilis, R8, dan profil dasar pengukuran, lihat postingan blog Mengapa Anda harus selalu menguji performa Compose dalam rilis?.
Pengaruh tiga fase Compose terhadap performa
Seperti yang dibahas dalam Fase Jetpack Compose, saat memperbarui frame, Compose melalui tiga fase:
- Komposisi: Compose menentukan apa yang akan ditampilkan–menjalankan fungsi composable dan mem-build hierarki UI.
- Tata letak: Compose menentukan ukuran dan penempatan setiap elemen di hierarki UI.
- Gambar: Compose benar-benar merender elemen UI individual.
Compose dapat dengan cermat melewati salah satu fase tersebut jika tidak diperlukan. Misalnya, satu elemen grafis beralih antara dua ikon dengan ukuran yang sama. Karena elemen tersebut tidak berubah ukuran, dan tidak ada elemen hierarki UI yang ditambahkan atau dihapus, Compose dapat melewati fase komposisi dan tata letak dan hanya menggambar ulang satu elemen tersebut.
Namun, beberapa kesalahan coding dapat mempersulit Compose mengetahui fase mana yang dapat dilewati dengan aman. Jika ragu, Compose akan menjalankan ketiga fase, yang dapat membuat UI Anda lebih lambat dari yang seharusnya. Jadi, banyak praktik terbaik performa berfokus pada membantu Compose untuk melewati fase yang tidak perlu dilakukan.
Ada beberapa prinsip umum yang dapat diikuti untuk meningkatkan performa secara umum.
Pertama, jika memungkinkan, pindahkan penghitungan dari fungsi composable. Fungsi composable mungkin perlu dijalankan kembali setiap kali UI berubah; kode apa pun yang Anda masukkan ke dalam composable akan dijalankan kembali, kemungkinan untuk setiap frame animasi. Jadi, Anda harus membatasi kode composable menjadi hanya yang benar-benar dibutuhkan untuk mem-build UI.
Kedua, menunda status baca selama mungkin. Dengan memindahkan pembacaan status ke composable turunan atau fase berikutnya, Anda dapat meminimalkan rekomposisi atau melewati fase komposisi sepenuhnya. Anda dapat melakukannya dengan meneruskan fungsi lambda, bukan nilai status untuk status yang sering berubah, dan dengan lebih memilih pengubah berbasis lambda saat Anda meneruskan status yang sering berubah. Anda dapat melihat contoh teknik ini di bagian Menunda pembacaan selama mungkin.