0Pricing
R Academy · Pelajaran

Membuat Profil Kode dengan Rprof dan profvis

Identifikasi fungsi yang menggunakan waktu paling banyak dalam skrip Anda.

Membuat Profil Kode dengan Rprof dan profvis adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Apa Itu Profiling?

Pengukuran memberi tahu Anda berapa lama kode berjalan. Profiling memberi tahu Anda di mana time digunakan di dalam kode tersebut. Profiler R mengambil sampel call stack pada interval teratur untuk membangun gambaran statistik tentang fungsi mana yang membutuhkan biaya besar.

Dua alat utamanya adalah Rprof() bawaan dan paket interaktif profvis.

Memulai dan Menghentikan Rprof()

Rprof('output.prof', interval = 0.01) memulai profiler. Fungsi ini menulis sampel call stack ke sebuah file setiap 10 ms. Jalankan kode yang lambat, lalu panggil Rprof(NULL) untuk menghentikan perekaman.

Argumen interval mengatur frekuensi pengambilan sampel dalam detik — nilai yang lebih kecil memberikan resolusi lebih tinggi, tetapi menghasilkan file output yang lebih besar.

# Pattern — do not run Rprof inside knitr/Quarto
# Rprof('my_profile.prof', interval = 0.01)
#
# slow_function <- function(n) {
#   x <- numeric(n)
#   for (i in seq_len(n)) x[i] <- sqrt(i)
#   sum(x)
# }
# slow_function(500000)
#
# Rprof(NULL)  # stop profiling

Membaca Hasil dengan summaryRprof()

summaryRprof('output.prof') menguraikan file profiling dan mengembalikan daftar dengan dua kerangka data:

  • by.self — time yang digunakan oleh setiap fungsi itu sendiri (tidak termasuk fungsi yang dipanggilnya)
  • by.total — total time termasuk semua fungsi yang dipanggil oleh fungsi tersebut

Urutkan berdasarkan self.pct untuk menemukan titik panas.

# After Rprof() run:
# prof <- summaryRprof('my_profile.prof')
# head(prof$by.self)
#
# Example output columns:
#            self.time self.pct total.time total.pct
# slow_fn        1.22     61.0       1.98      99.0
# sqrt           0.76     38.0       0.76      38.0
# sum            0.02      1.0       0.02       1.0

Self time vs Total time

Memahami self time dan total time sangat penting dalam profiling:

  • Self time — time yang digunakan fungsi untuk menjalankan barisnya sendiri (tanpa menunggu fungsi yang dipanggilnya)
  • Total time — self time ditambah seluruh time yang digunakan oleh fungsi yang dipanggilnya

Fungsi dengan total time tinggi tetapi self time rendah menjadi lambat karena hal yang dipanggilnya, bukan karena logikanya sendiri. Optimalkan fungsi yang dipanggil, bukan pemanggilnya.

# Conceptual example:
# wrapper() -> process_data() -> slow_sort()
#
# total.pct: wrapper=100, process_data=90, slow_sort=85
# self.pct:  wrapper=5,   process_data=5,  slow_sort=85
#
# => slow_sort is the real bottleneck to fix.
cat('High total + low self => the culprit is a callee function
')

Memperkenalkan profvis

profvis membungkus Rprof() dan menyediakan grafik api HTML interaktif di RStudio atau peramban. Grafik ini jauh lebih mudah dibaca daripada output mentah summaryRprof().

Instal sekali dengan install.packages('profvis'), lalu bungkus kode Anda dengan profvis({...}).

# library(profvis)
#
# profvis({
#   n <- 200000
#   x <- numeric(n)
#   for (i in seq_len(n)) x[i] <- log(i)
#   total <- sum(x)
#   sorted <- sort(x)
# })

Membaca Grafik Api profvis

Output profvis memiliki dua panel:

  • Grafik api — batang horizontal dengan lebar = time; batang bertingkat = kedalaman call stack
  • Tabel data — tampilan yang dapat diurutkan berdasarkan self time dan total time untuk setiap fungsi dan baris sumber

Batang lebar di bagian bawah grafik api adalah pemanggil dengan biaya terbesar. Tumpukan tinggi menunjukkan rantai pemanggilan yang dalam.

# Reading the flame graph:
# - Each horizontal bar = one function on the call stack
# - Width proportional to time spent
# - Bottom = outermost caller, top = deepest callee
# - Click a bar to zoom in
# - 'Memory' tab shows allocation by line
cat('profvis shows self time per source line — invaluable for tight loops
')

Mengidentifikasi Titik Panas

Setelah melihat output profvis, identifikasi titik panas dengan mencari fungsi yang lebarnya besar pada grafik api dan memiliki self time tinggi. Penyebab umum di R:

  • Perulangan yang tidak divektorisasi dan melakukan pekerjaan elemen demi elemen
  • rbind() atau c() berulang yang memperbesar objek di dalam perulangan
  • Penguraian regex atau string berulang dalam perulangan ketat
# Before fix — growing vector in loop (common hot spot)
# profvis reveals repeated reallocations:
# result <- c()
# for (i in 1:50000) result <- c(result, i^2)
#
# After fix — pre-allocated:
# result <- numeric(50000)
# for (i in 1:50000) result[i] <- i^2
cat('Pre-allocation eliminates the most common loop hot spot
')

Membuat Profil Alokasi Memori

Rprof juga dapat melacak alokasi memori dengan memory.profiling = TRUE. profvis menampilkan panel memori di samping pengukuran time, sehingga Anda dapat menemukan fungsi yang mengalokasikan objek sementara berukuran besar — salah satu sumber utama jeda garbage collection.

# Memory profiling with Rprof:
# Rprof('mem.prof', interval = 0.01, memory.profiling = TRUE)
# ... slow code ...
# Rprof(NULL)
# prof <- summaryRprof('mem.prof', memory = 'both')
# head(prof$by.self)
#
# profvis also shows mem delta per line automatically
cat('Memory profiling pinpoints allocation hot spots causing GC pauses
')

Membuat Profil Pipeline Nyata

Terapkan profiling secara sistematis pada pipeline data: bungkus seluruh pipeline dalam profvis({}), identifikasi tahap yang paling lambat, optimalkan tahap tersebut, lalu lakukan profiling ulang untuk memastikan adanya perbaikan. Jangan pernah mengoptimalkan secara membabi buta.

# Workflow:
# 1. profvis({ full_pipeline() })   => identify Stage 3 is 80% of time
# 2. Rewrite Stage 3 (vectorize / use data.table)
# 3. profvis({ full_pipeline() })   => confirm Stage 3 now < 10%
# 4. system.time({ full_pipeline() }) => confirm overall speedup
cat('Profile -> identify -> fix -> re-profile is the correct cycle
')

Keterbatasan Pengambilan Sampel Rprof

Rprof menggunakan pengambilan sampel statistik, sehingga fungsi yang sangat cepat (lebih cepat daripada interval pengambilan sampel) mungkin tidak muncul. Untuk micro-benchmark expression kecil, gunakan paket microbenchmark.

Selain itu, Rprof tidak membuat profil kode C/C++ di bawah interface R — hanya call stack tingkat R yang terlihat.

# Rprof interval = 0.01s => functions faster than 10ms may not appear
# For sub-millisecond work use microbenchmark:
#   microbenchmark(expr1, expr2, times = 1000L)
#
# For C-level profiling use external tools:
#   - Instruments (macOS)
#   - perf (Linux)
cat('Rprof is for R-level profiling; use microbenchmark for micro-timing
')

Praktik Terbaik untuk Profiling R

Ikuti praktik berikut untuk mendapatkan hasil profiling yang andal:

  • Lakukan profiling dengan ukuran data yang realistis — input kecil menyembunyikan hambatan yang sebenarnya
  • Jalankan perulangan pemanasan sebelum profiling untuk mengecualikan biaya penyiapan satu kali
  • Lakukan profiling dalam sesi R yang bersih agar tidak terganggu oleh paket yang dimuat
  • Gunakan profvis untuk eksplorasi; gunakan summaryRprof untuk laporan CI/otomatis
# Clean session profiling checklist:
# 1. Restart R (Ctrl+Shift+F10 in RStudio)
# 2. Load only required packages
# 3. Run once to warm up
# 4. profvis({ ... })  on second run
# 5. Compare before/after with system.time()
cat('Always profile with realistic data in a clean R session
')

Pemeriksaan Singkat: Self vs Total Rprof

Sebuah fungsi menampilkan total.pct = 95% tetapi self.pct = 3% dalam output summaryRprof(). Apa yang dapat Anda simpulkan?

Rangkuman Alat Profiling

R menyediakan seperangkat alat profiling dua tingkat:

  • Rprof('file.prof', interval=0.01) + Rprof(NULL) + summaryRprof() — bawaan, dapat ditulis dalam skrip, dan sesuai untuk CI
  • profvis({...}) — grafik api interaktif dengan anotasi baris sumber dan pelacakan memori

Alur kerja yang benar selalu: ukur terlebih dahulu, identifikasi titik terpanas, optimalkan hanya bagian itu, lalu ukur kembali untuk memastikan peningkatannya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Profil Kode dengan Rprof dan profvis” gratis?

Ya — teks lengkap “Membuat Profil Kode dengan Rprof dan profvis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Profil Kode dengan Rprof dan profvis”?

Identifikasi fungsi yang menggunakan waktu paling banyak dalam skrip Anda. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Membuat Profil Kode dengan Rprof dan profvis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. system.time() dan proc.time()
  2. Membuat Profil Kode dengan Rprof dan profvis
  3. Vektorisasi untuk Kecepatan
  4. Menguji Kinerja dengan microbenchmark
← Kembali ke R Academy