Contoh pengukuran dan analisis performa

Contoh ini menunjukkan cara menggunakan pelacakan sistem dengan Macrobenchmark, beserta pembuatan profil memori, untuk mengukur dan memperbaiki jenis masalah performa tertentu.

Memproses debug startup aplikasi menggunakan systrace

Saat memproses debug pada waktu startup, sebaiknya gunakan log systrace. Systrace adalah sistem yang menggunakan kode yang diinstrumentasi sebelumnya untuk menampilkan berapa lama peristiwa tertentu terjadi saat terjadi. Trace ini memungkinkan Anda untuk melihat apa yang terjadi dalam aplikasi, atau bahkan dalam proses lain di seluruh sistem. Platform Android dan library Jetpack memiliki instrumentasi pada berbagai peristiwa utama dalam aplikasi, dan log tersebut telah dicatat sebagaimana mestinya. Anda juga dapat melengkapi aplikasi dengan trace kustom Anda sendiri, yang akan muncul di alat visualisasi systrace yang sama, untuk memberikan gambaran keseluruhan tentang hal yang terjadi dalam aplikasi.

Menggunakan systrace atau Perfetto

Untuk mempelajari penggunaan systrace dasar lebih lanjut, lihat video berikut: Memproses debug Performa Aplikasi.

Untuk menganalisis waktu startup, terlebih dahulu Anda harus memahami apa yang terjadi selama startup. Jika Anda menginginkan informasi lebih dari yang dijelaskan di halaman ini, dokumentasi tentang waktu startup Aplikasi memberikan ringkasan tentang proses startup aplikasi.

Tahap startup aplikasi adalah:

  • Meluncurkan proses
  • Menginisialisasi objek aplikasi generik
  • Membuat dan inisialisasi aktivitas
  • Meng-inflate tata letak
  • Menggambar frame pertama

Jenis startup memiliki tahapan berikut:

  • Cold start: Tahapan ini terjadi saat aplikasi dimulai untuk pertama kalinya sejak booting, atau sejak proses aplikasi dimatikan, oleh pengguna atau oleh sistem. Startup membuat proses baru tanpa status tersimpan.
  • Warm start: Tahapan ini terjadi saat aplikasi sudah berjalan di latar belakang, tetapi aktivitas harus dibuat ulang dan dibawa ke latar depan. Aktivitas dibuat ulang saat menggunakan kembali proses yang ada, atau proses dibuat ulang dengan status tersimpan. Library pengujian Macrobenchmark mendukung pengujian warm startup yang konsisten menggunakan opsi pertama.
  • Hot start: Hal ini terjadi ketika proses dan aktivitas masih berjalan dan hanya perlu dibawa ke latar depan, mungkin dengan membuat ulang beberapa objek sesuai kebutuhan, serta merender aktivitas latar depan yang baru. Ini adalah skenario startup terpendek.

Sebaiknya tangkap systraces menggunakan aplikasi pelacakan sistem di perangkat yang tersedia di Opsi Developer. Jika ingin menggunakan alat command line, Perfetto tersedia untuk digunakan dengan Android 10 (API level 29) dan yang lebih tinggi, sedangkan perangkat pada versi sebelumnya harus menggunakan systrace.

Perhatikan bahwa istilah "frame pertama" sedikit keliru karena aplikasi dapat bervariasi secara signifikan dalam cara menangani startup setelah membuat aktivitas awal. Beberapa aplikasi akan terus mengalami inflasinya untuk beberapa frame, sementara aplikasi lainnya akan langsung diluncurkan ke aktivitas sekunder.

Jika memungkinkan, sebaiknya sertakan panggilan reportFullyDrawn (tersedia di Android 10 dan lebih tinggi) saat startup selesai dari sudut pandang aplikasi.

Beberapa hal yang perlu diperhatikan dalam pelacakan sistem ini meliputi:

Memantau pertentangan
Gambar 1. Persaingan untuk resource yang dilindungi monitor dapat menyebabkan penundaan yang signifikan pada startup aplikasi.

Transaksi binder sinkron
Gambar 2. Cari transaksi yang tidak perlu di jalur penting aplikasi Anda.

Pembersihan sampah memori serentak
Gambar 3. Pembersihan sampah memori serentak adalah hal yang umum dan memiliki dampak yang relatif rendah, tetapi jika Anda sering mengalaminya, pertimbangkan untuk menyelidikinya dengan memory profiler Android Studio.

I/O saat startup
Gambar 4. Periksa I/O selama startup dan cari penghentian yang panjang.

Pada gambar 4, perlu diperhatikan bahwa proses lain yang menjalankan I/O secara bersamaan dapat menyebabkan pertentangan I/O, sehingga pastikan proses lain tidak berjalan.

Aktivitas yang signifikan pada thread lain dapat mengganggu UI thread, jadi berhati-hatilah terhadap pekerjaan latar belakang selama startup. Perhatikan bahwa perangkat dapat memiliki konfigurasi CPU yang berbeda, sehingga jumlah thread yang dapat dijalankan secara paralel dapat bervariasi di berbagai perangkat.

Lihat juga panduan tentang sumber umum jank

Menggunakan memory profiler Android Studio

Memory profiler Android Studio adalah alat yang andal untuk mengurangi tekanan memori yang mungkin disebabkan oleh kebocoran memori atau pola penggunaan yang buruk. Alat ini memberikan tampilan langsung dari alokasi objek dan pembersihan.

Untuk memperbaiki masalah memori di aplikasi, Anda dapat menggunakan memory profiler untuk melacak alasan dan seberapa sering pembersihan sampah memori dilakukan, serta apakah mungkin ada kebocoran memori yang menyebabkan heap terus meningkat dari waktu ke waktu.

Membuat profil memori aplikasi dipecah menjadi beberapa langkah berikut:

1. Mendeteksi masalah memori

Untuk mendeteksi masalah memori, mulai dengan merekam sesi pembuatan profil memori untuk aplikasi Anda. Berikutnya, cari objek yang jejak memorinya meningkat, yang pada akhirnya memicu peristiwa pembersihan sampah memori.

Peningkatan jumlah objek
Gambar 5. Memory profiler menampilkan peningkatan alokasi objek dari waktu ke waktu.

Pembersihan sampah memori
Gambar 6. Memory profiler menampilkan peristiwa pembersihan sampah memori.{.:image-caption}

Setelah mengidentifikasi kasus penggunaan yang menambah tekanan memori, mulailah menganalisis penyebab utamanya.

2. Mendiagnosis hot spot tekanan memori

Pilih rentang pada linimasa untuk memvisualisasikan alokasi dan shallow size.

Memvisualisasikan alokasi dan shallow size
Gambar 7. Memory profiler menampilkan alokasi dan ukuran untuk rentang yang dipilih di linimasa.

Ada beberapa cara untuk mengurutkan data ini. Bagian berikut memberikan beberapa contoh tentang bagaimana setiap tampilan dapat membantu Anda menganalisis masalah.

Mengatur berdasarkan class

Mengatur berdasarkan class berguna bila Anda ingin menemukan class yang menghasilkan objek yang seharusnya di-cache atau digunakan kembali dari gabungan memori.

Misalnya, bayangkan Anda melihat aplikasi yang membuat 2.000 objek class yang disebut "Vertex" setiap detik. Hal ini akan meningkatkan jumlah alokasi sebesar 2.000 setiap detik dan Anda akan melihatnya saat mengurutkan berdasarkan class. Apakah objek tersebut harus digunakan kembali untuk menghindari pembuatan sampah tersebut? Jika jawabannya adalah ya, maka kemungkinan penerapan gabungan memori akan diperlukan.

Mengatur berdasarkan callstack

Mengatur berdasarkan callstack berguna saat ada jalur panas tempat memori dialokasikan, seperti di dalam loop atau fungsi tertentu yang melakukan banyak pekerjaan alokasi. Melihat melalui callstack akan memungkinkan Anda melihat hotspot alokasi tersebut.

Shallow size versus retained size

Shallow size hanya melacak memori objek itu sendiri, sehingga sangat berguna untuk melacak class sederhana yang terdiri dari terutama primitif.

Retained size menunjukkan total memori yang dialokasikan oleh objek secara langsung serta objek lain yang dialokasikan yang hanya direferensikan oleh objek. Hal ini berguna untuk melacak tekanan memori karena objek kompleks yang memerlukan alokasi objek lain dan bukan hanya kolom primitif. Untuk mendapatkan nilai ini, buat memory dump menggunakan memory profiler. Objek yang dialokasikan dalam heap tersebut telah ditambahkan ke tampilan.

Memory dump penuh
Gambar 8. Anda dapat membuat memory dump kapan saja dengan mengklik tombol heap Dump Java di toolbar memory profiler.

ditambahkan sebagai kolom
Gambar 9. Membuat memory dump menampilkan kolom yang menunjukkan alokasi objek dalam heap tersebut.

3. Mengukur dampak pengoptimalan

Satu peningkatan pengoptimalan memori yang mudah diukur adalah pembersihan sampah memori. Saat pengoptimalan mengurangi tekanan memori, Anda akan melihat lebih sedikit pembersihan sampah memori (GC). Untuk mengukurnya, ukur waktu di antara GC di linimasa profiler. Anda seharusnya melihat durasi yang lebih lama antar-GC setelah pengoptimalan memori.

Dampak akhir dari peningkatan memori seperti ini adalah:

  • Aplikasi akan lebih jarang dimatikan karena masalah Out of Memory jika aplikasi tidak terus-menerus mengalami tekanan memori.
  • Memiliki lebih sedikit GC meningkatkan metrik jank. Hal ini karena GC menyebabkan pertentangan CPU, yang dapat menyebabkan perenderan tugas yang ditangguhkan saat GC terjadi.