Memeriksa rekaman aktivitas

Tampilan rekaman aktivitas di CPU Profiler menyediakan beberapa cara untuk melihat informasi dari rekaman aktivitas.

Untuk rekaman aktivitas metode dan rekaman aktivitas fungsi, Anda dapat melihat Call Chart langsung di linimasa Threads dan tab Flame Chart, Top Down, Bottom Up, dan Events dari panel Analysis. Untuk frame callstack, Anda dapat melihat bagian kode yang telah dieksekusi dan alasannya dipanggil. Untuk pelacakan sistem, Anda dapat melihat Trace Events langsung di linimasa Threads, dan tab Flame Chart, Top Down, Bottom Up, serta Events dari panel Analysis.

Pintasan mouse dan keyboard tersedia untuk memudahkan navigasi Call Charts atau Trace Events.

Memeriksa rekaman aktivitas menggunakan Call Chart

Call Chart memberikan representasi grafis dari rekaman aktivitas metode atau rekaman aktivitas fungsi, dengan periode dan waktu panggilan diwakili pada sumbu horizontal, dan tujuan panggilannya ditampilkan di sepanjang sumbu vertikal. Panggilan ke API sistem ditunjukkan dengan warna oranye, panggilan ke metode aplikasi Anda ditunjukkan dengan warna hijau, dan panggilan ke API pihak ketiga (termasuk API bahasa Java) ditunjukkan dengan warna biru. Gambar 4 menunjukkan contoh call chart dan menggambarkan konsep waktu mandiri (self), waktu turunan (children), dan total waktu untuk metode atau fungsi tertentu. Anda dapat mempelajari konsep-konsep ini lebih lanjut di bagian tentang cara memeriksa rekaman aktivitas menggunakan Top Down dan Bottom Up.

Gambar 1. Contoh call chart yang menggambarkan waktu mandiri, waktu turunan, dan total waktu untuk metode D.

Tips: Untuk melompati kode sumber suatu metode atau fungsi, klik kanan metode atau fungsi dan pilih Jump to Source. Cara ini dapat dilakukan dari tab panel Analysis mana pun.

Memeriksa rekaman aktivitas menggunakan tab Flame Chart

Tab Flame Chart menyediakan call chart terbalik yang menggabungkan stack panggilan identik. Artinya, metode atau fungsi identik yang memiliki urutan pemanggil yang sama akan dikumpulkan dan direpresentasikan sebagai batang yang lebih panjang dalam flame chart (bukan menampilkannya sebagai beberapa batang yang lebih pendek, seperti dalam call chart). Hal ini memudahkan Anda melihat metode atau fungsi mana yang paling banyak menghabiskan waktu. Namun, hal ini juga berarti sumbu horizontal tidak merepresentasikan linimasa; sebagai gantinya, sumbu ini menunjukkan jumlah waktu relatif yang dibutuhkan setiap metode atau fungsi untuk dieksekusi.

Untuk membantu menggambarkan konsep ini, pertimbangkan call chart pada Gambar 2. Perlu diketahui bahwa metode D membuat beberapa panggilan ke B (B1, B2, dan B3), dan beberapa panggilan ke B tersebut membuat panggilan ke C (C1 dan C3).

Gambar 2. Call chart dengan beberapa panggilan metode yang memiliki urutan pemanggil yang sama.

Karena B1, B2, dan B3 memiliki urutan pemanggil yang sama (A → D → B), semuanya akan digabungkan, seperti dalam Gambar 3. Demikian pula, C1 dan C3 digabungkan karena memiliki urutan pemanggil yang sama (A → D → B → C); perlu diketahui bahwa C2 tidak disertakan karena memiliki urutan pemanggil yang berbeda (A → D → C).

Gambar 3. Menggabungkan metode identik yang memiliki stack panggilan yang sama.

Panggilan yang digabungkan digunakan untuk membuat flame chart, seperti dalam Gambar 4. Perlu diketahui bahwa untuk setiap panggilan tertentu dalam flame chart, tujuan panggilan yang memakai paling banyak waktu CPU akan muncul terlebih dahulu.

Gambar 4. Representasi flame chart dari call chart yang ditunjukkan dalam gambar 5.

Memeriksa rekaman aktivitas menggunakan Top Down dan Bottom Up

Tab Top Down menampilkan daftar panggilan, yang jika digunakan untuk memperluas node metode atau fungsi akan menampilkan tujuan panggilannya. Gambar 5 menunjukkan grafik top down untuk call chart dalam Gambar 1. Setiap panah dalam grafik menunjuk dari pemanggil ke tujuan panggilan.

Seperti dalam Gambar 5, memperluas node untuk metode A di tab Top Down akan menampilkan tujuan panggilannya, yaitu metode B dan D. Setelah itu, memperluas node untuk metode D akan menampilkan tujuan panggilannya, metode B dan C, dan seterusnya. Begitu juga dengan tab Flame chart, pohon top down menggabungkan informasi rekaman aktivitas untuk metode identik dengan stack panggilan yang sama. Artinya, tab Flame chart menyediakan representasi grafis dari tab Top down.

Tab Top Down menyediakan informasi berikut ini untuk membantu mendeskripsikan waktu CPU yang dihabiskan bagi setiap panggilan (waktu juga direpresentasikan sebagai persentase total waktu thread dalam rentang yang dipilih):

  • Self: waktu yang dihabiskan oleh panggilan metode atau fungsi untuk mengeksekusi kodenya sendiri, bukan milik tujuan panggilannya, seperti dalam Gambar 1 untuk metode D.
  • Children: waktu yang dihabiskan oleh panggilan metode atau fungsi untuk mengeksekusi tujuan panggilannya, bukan kodenya sendiri, seperti dalam Gambar 1 untuk metode D.
  • Total: jumlah waktu Self dan Children milik metode. Informasi ini menyatakan total waktu yang dihabiskan oleh aplikasi untuk mengeksekusi panggilan, seperti dalam Gambar 1 untuk metode D.

Gambar 5. Pohon Top Down.

Gambar 6. Pohon Bottom Up untuk metode C dari Gambar 5.

Tab Bottom Up menampilkan daftar panggilan, yang jika digunakan untuk memperluas node fungsi atau metode akan menampilkan pemanggilnya. Dengan menggunakan contoh rekaman aktivitas yang ditampilkan dalam Gambar 5, gambar 6 memberikan pohon bottom up untuk metode C. Membuka node untuk metode C di pohon bottom up akan menampilkan setiap pemanggil uniknya, yaitu metode B dan D. Perlu diketahui bahwa meskipun B memanggil C dua kali, B hanya akan muncul sekali saat memperluas node untuk metode C di pohon bottom up. Setelah itu, memperluas node untuk B akan menampilkan pemanggilnya, yaitu metode A dan D.

Tab Bottom Up berguna untuk mengurutkan metode atau fungsi berdasarkan yang paling banyak (atau paling sedikit) menghabiskan waktu CPU. Anda dapat memeriksa setiap node guna menentukan pemanggil mana yang menghabiskan paling banyak waktu CPU untuk memanggil metode atau fungsi tersebut. Dibandingkan pohon top down, informasi pengaturan waktu untuk setiap metode atau fungsi di pohon bottom up saling berhubungan dengan metode di bagian atas setiap pohon (node atas). Waktu CPU juga direpresentasikan sebagai persentase total waktu thread selama perekaman tersebut. Tabel berikut ini membantu menjelaskan cara menafsirkan informasi pengaturan waktu untuk node atas dan pemanggilnya (sub-node).

Mandiri Turunan Total
Metode atau fungsi di bagian atas pohon bottom up (node atas) Menyatakan total waktu yang dihabiskan oleh metode atau fungsi untuk mengeksekusi kodenya sendiri, bukan kode tujuan panggilannya. Dibandingkan pohon top down, informasi pengaturan waktu ini menyatakan jumlah semua panggilan ke metode atau fungsi ini selama durasi perekaman. Menyatakan total waktu yang dihabiskan oleh metode atau fungsi untuk mengeksekusi tujuan panggilannya, bukan kodenya sendiri. Dibandingkan pohon top down, informasi pengaturan waktu ini menyatakan jumlah semua panggilan ke tujuan panggilan metode atau fungsi ini selama durasi perekaman. Jumlah waktu mandiri dan waktu turunan.
Pemanggil (sub-node) Menyatakan total waktu mandiri tujuan panggilan ketika dipanggil oleh pemanggil. Menggunakan pohon bottom up dalam Gambar 6 sebagai contoh, waktu mandiri untuk metode B akan sama dengan jumlah waktu mandiri untuk setiap eksekusi metode C ketika dipanggil oleh B. Menyatakan total waktu turunan dari tujuan panggilan ketika dipanggil oleh pemanggil. Menggunakan pohon bottom up dalam Gambar 6 sebagai contoh, waktu turunan untuk metode B akan sama dengan jumlah waktu turunan untuk setiap eksekusi metode C ketika dipanggil oleh B. Jumlah waktu mandiri dan waktu turunan.

Catatan: Untuk perekaman tertentu, Android Studio akan berhenti mengumpulkan data baru ketika profiler mencapai batas ukuran file (namun, perekaman tidak akan dihentikan). Hal ini biasanya terjadi jauh lebih cepat saat melakukan perekaman aktivitas yang diinstrumentasi karena jenis rekaman aktivitas ini mengumpulkan lebih banyak data di waktu yang lebih singkat dibandingkan perekaman aktivitas dengan sampel. Jika Anda memperpanjang waktu pemeriksaan hingga periode perekaman yang terjadi setelah batas tercapai, data pengaturan waktu di panel rekaman aktivitas tidak akan berubah (karena tidak ada data baru yang tersedia). Selain itu, panel rekaman aktivitas akan menampilkan NaN untuk informasi pengaturan waktu jika Anda hanya memilih sebagian rekaman tanpa data yang tersedia.

Memeriksa rekaman aktivitas menggunakan tabel Events

Tabel Events mencantumkan semua panggilan dalam thread yang dipilih saat ini. Anda dapat mengurutkannya dengan mengklik header kolom. Dengan memilih baris dalam tabel, Anda dapat membuka linimasa untuk waktu mulai dan berakhir pada panggilan yang dipilih. Ini memungkinkan Anda untuk menemukan peristiwa secara akurat di linimasa.

Gambar 7. Melihat tab Events di panel Analysis.

Memeriksa frame callstack

Callstack berguna untuk memahami bagian kode mana yang telah dieksekusi, dan alasan kode dipanggil. Jika Callstack Sample Recording dikumpulkan untuk program Java/Kotlin, callstack biasanya tidak hanya menyertakan kode Java/Kotlin, tetapi juga mencakup frame dari kode native JNI, mesin virtual Java. (misalnya, android::AndroidRuntime::start), dan kernel sistem ([kernel.kallsyms]+offset). Hal ini dikarenakan program Java/Kotlin biasanya dijalankan melalui mesin virtual Java. Kode native diperlukan untuk menjalankan program itu sendiri dan agar program dapat berkomunikasi dengan sistem dan hardware. Profiler menampilkan frame ini untuk presisi; tetapi, bergantung pada investigasi Anda, Anda mungkin akan merasa frame panggilan tambahan ini berguna atau mungkin tidak. Profiler menyediakan cara untuk menciutkan frame yang tidak Anda minati sehingga Anda dapat menyembunyikan informasi yang tidak relevan untuk investigasi Anda.

Pada contoh di bawah, rekaman aktivitas di bawah ini memiliki banyak frame berlabel [kernel.kallsyms]+offset, yang saat ini tidak berguna untuk pengembangan

Contoh rekaman aktivitas panggilan

Untuk menciutkan frame ini menjadi satu, pilih tombol Collapse frames dari toolbar, pilih jalur yang akan diciutkan, dan pilih tombol Apply untuk menerapkan perubahan Anda. Dalam contoh ini, jalurnya adalah [kernel.kallsyms].

Contoh menu simpleperf

Tindakan ini akan menciutkan frame yang sesuai dengan jalur yang dipilih di panel kiri dan kanan, seperti yang ditunjukkan di bawah ini.

Contoh frame simpleperf yang diciutkan

Memeriksa rekaman aktivitas sistem

Saat memeriksa rekaman aktivitas sistem, Anda dapat memeriksa Trace Events di linimasa Threads untuk melihat detail peristiwa yang terjadi pada setiap thread. Arahkan kursor mouse ke suatu peristiwa untuk melihat nama peristiwa dan waktu yang dihabiskan dalam setiap status. Klik peristiwa untuk melihat informasi lebih lanjut di panel Analysis.

Memeriksa rekaman aktivitas sistem: inti CPU

Selain data penjadwalan CPU, rekaman aktivitas juga menyertakan frekuensi CPU berdasarkan core. Ini menunjukkan jumlah aktivitas pada setiap inti dan dapat memberikan ide tentang aktivitas mana yang merupakan inti "besar" atau "kecil" dalam prosesor seluler modern.

Gambar 8. Menampilkan aktivitas CPU dan peristiwa rekaman aktivitas untuk thread render.

Panel CPU Cores (seperti yang ditunjukkan pada Gambar 8) menampilkan aktivitas thread yang dijadwalkan pada setiap inti. Arahkan kursor mouse ke aktivitas thread untuk melihat thread mana yang dijalankan inti ini pada waktu tertentu.

Untuk mengetahui informasi selengkapnya tentang pemeriksaan informasi rekaman aktivitas sistem, lihat bagian Memeriksa masalah performa UI dalam dokumentasi systrace.

Memeriksa rekaman aktivitas sistem: Linimasa rendering frame

Anda dapat memeriksa waktu yang dibutuhkan oleh aplikasi untuk merender setiap frame pada thread utama dan RenderThread untuk menyelidiki bottleneck yang menyebabkan UI menjadi lambat dan framerate menjadi rendah. Untuk mempelajari cara menggunakan rekaman aktivitas sistem guna menyelidiki dan membantu mengurangi jank UI, lihat Deteksi jank UI.

Memeriksa rekaman aktivitas sistem: Process Memory (RSS)

Untuk aplikasi yang di-deploy ke perangkat yang menjalankan Android 9 atau yang lebih baru, bagian Process Memory (RSS) menampilkan jumlah memori fisik yang saat ini digunakan oleh aplikasi.

Gambar 9. Menampilkan memori fisik di profiler.

Total

Ini adalah jumlah total memori fisik yang saat ini digunakan oleh proses Anda Pada sistem berbasis Unix, ini dikenal sebagai "Resident Set Size", dan merupakan kombinasi dari semua memori yang digunakan oleh alokasi anonim, pemetaan file, dan alokasi memori bersama.

Untuk developer Windows, Resident Set Size serupa dengan Working Set Size.

Allocated

Penghitung ini melacak banyaknya memori fisik yang saat ini digunakan oleh alokasi memori normal proses. Ini adalah alokasi yang bersifat anonim (tidak didukung oleh file tertentu) dan pribadi (tidak dibagikan). Pada sebagian besar aplikasi, terdiri dari alokasi heap (dengan malloc atau new) dan memori tumpukan. Saat ditukar dari memori fisik, alokasi ini ditulis ke file swap sistem.

Pemetaan File

Penghitung ini melacak jumlah memori fisik yang digunakan proses untuk pemetaan file - yaitu, memori yang dipetakan dari file ke dalam region memori oleh pengelola memori.

Dibagikan

Penghitung ini melacak berapa banyak memori fisik yang digunakan untuk berbagi memori antara proses ini dan proses lainnya dalam sistem.