argabayu— Backend & Systems Engineer

Membaca flame graph tanpa menipu diri sendiri

14 Mei 2026·8 min baca·#performa#profiling

Flame graph menunjukkan di mana waktu dihabiskan, dan itu sangat berharga. Ia juga sangat mudah disalahartikan.

Kesalahan pertama: lebar = lambat

Batang lebar berarti fungsi itu sering muncul di tumpukan sampel. Itu belum berarti ia lambat — bisa saja ia cepat tapi dipanggil satu juta kali.

Yang dicari adalah lebar yang tidak proporsional terhadap pekerjaannya. Fungsi serialisasi yang menghabiskan 30% waktu lebih mencurigakan daripada fungsi pembacaan yang menghabiskan 30%.

Kesalahan kedua: mengabaikan apa yang tidak ada

Flame graph tidak menunjukkan waktu yang dihabiskan menunggu. Kalau program menghabiskan 90% waktunya menunggu I/O, grafnya akan terlihat sangat sepi dan semuanya tampak baik-baik saja.

bash
# Profil CPU, bukan waktu dinding
go test -cpuprofile=cpu.out -bench=.
go tool pprof -http=:8080 cpu.out

Kalau CPU profile sepi tapi programnya lambat, persoalannya di tempat lain: kunci, I/O, atau alokasi.

Kesalahan ketiga: mengukur kode yang berbeda

Profil di mesin pengembangan sering menyesatkan. Perbedaan ukuran cache, jumlah core, dan keberadaan kunci konkurensi mengubah hasilnya secara kualitatif.

Yang saya lakukan sekarang

Sebelum melihat graf:

  1. Ukur dulu dengan angka tunggal — berapa detiknya. Kalau tidak ada angka awal, tidak ada cara tahu apakah perubahan memperbaiki sesuatu.
  2. Ubah satu hal, ukur ulang.
  3. Simpan profil sebelum dan sesudah, agar bisa dibandingkan.

Intuisi saya tentang bagian mana yang lambat salah kira-kira dua dari tiga kali. Angka tidak pernah berdebat.