Menguji Kinerja dengan microbenchmark
Bandingkan beberapa implementasi secara statistik dengan microbenchmark().
Menguji Kinerja dengan microbenchmark adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Mengapa Menggunakan microbenchmark?
system.time() memiliki resolusi milidetik dan tidak andal untuk operasi yang cepat. Paket microbenchmark menjalankan ekspresi ratusan kali, menangani pemanasan, dan melaporkan statistik dengan resolusi nanodetik—sehingga menjadi alat yang tepat untuk membandingkan implementasi yang serupa.
Penggunaan Dasar microbenchmark
Berikan ekspresi bernama kepada microbenchmark(). Nama setiap argumen akan menjadi label dalam keluaran. Argumen times menentukan berapa kali setiap ekspresi dievaluasi.
# library(microbenchmark)
# x <- 1:10000
#
# microbenchmark(
# loop = {
# s <- 0
# for (v in x) s <- s + v
# },
# vectorized = sum(x),
# times = 200L
# )Memilih Argumen times
Pengulangan yang lebih banyak menghasilkan estimasi yang lebih stabil, tetapi membutuhkan waktu lebih lama. Panduan umum:
- Ekspresi cepat (mikrodetik):
times = 1000Latau lebih - Ekspresi sedang (milidetik):
times = 100L - Ekspresi lambat (detik):
times = 10Latau kurang
Nilai bawaan adalah times = 100L, yang merupakan titik awal yang baik.
# library(microbenchmark)
# microbenchmark(
# fast_op = sqrt(2),
# times = 10000L # many reps for a nanosecond-scale operation
# )
# microbenchmark(
# slow_op = sort(rnorm(1e6)),
# times = 10L # fewer reps for second-scale operation
# )Menentukan Argumen unit
Gunakan argumen unit untuk menampilkan hasil dalam skala yang mudah digunakan:
'ns'—nanodetik (untuk operasi yang sangat cepat)'us'—mikrodetik'ms'—milidetik's'—detik'relative'—rasio terhadap ekspresi tercepat
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
# sapply_sqrt = sapply(x, sqrt),
# vectorized = sqrt(x),
# times = 500L,
# unit = 'us' # display in microseconds
# )Menafsirkan Keluaran Ringkasan
microbenchmark mencetak tabel ringkasan dengan kolom-kolom berikut:
- min—satu kali eksekusi tercepat
- lq / mean / median / uq—kuartil bawah, rata-rata, median, kuartil atas
- max—satu kali eksekusi terlambat
- neval—jumlah evaluasi
Gunakan median sebagai metrik perbandingan utama—metrik ini tahan terhadap jeda GC sesekali yang memperbesar nilai maksimum dan rata-rata.
# Example summary output (unit: microseconds):
#
# expr min lq mean median uq max neval
# loop 1203.1 1245.3 1301.7 1262.4 1310.1 2100.8 100
# vectorized 2.1 2.3 2.9 2.4 2.6 18.3 100
#
# => vectorized is ~525x faster at median
cat('Always compare medians, not means, for microbenchmark results
')summary() pada Objek microbenchmark
Memanggil summary(mb) pada hasil microbenchmark yang disimpan akan mengembalikan kerangka data yang dapat Anda periksa secara terprogram. Anda juga dapat mengubah unit dalam pemanggilan ringkasan.
# library(microbenchmark)
# x <- rnorm(5000)
# mb <- microbenchmark(
# vapply_abs = vapply(x, abs, numeric(1)),
# base_abs = abs(x),
# times = 200L
# )
# s <- summary(mb, unit = 'ms')
# print(s[, c('expr', 'min', 'median', 'max')])autoplot() untuk Perbandingan Visual
autoplot(mb) menggunakan ggplot2 untuk menggambar plot biola atau plot kotak dari distribusi waktu di berbagai ekspresi. Dengan demikian, Anda dapat melihat bukan hanya perbedaan median, tetapi juga variabilitas dan tumpang tindih antaralternatif.
# library(microbenchmark)
# library(ggplot2)
#
# x <- 1:50000
# mb <- microbenchmark(
# loop = { s <- 0; for (v in x) s <- s + v },
# vapply = vapply(x, identity, numeric(1)),
# vec = sum(x),
# times = 100L
# )
# autoplot(mb) # opens ggplot2 violin chartMembandingkan Perulangan dengan vapply dan sapply
Benchmark klasik: menerapkan fungsi per elemen menggunakan perulangan for, sapply(), atau vapply(). vapply() lebih cepat daripada sapply() karena melakukan pra-alokasi vektor hasil. Keduanya lebih lambat daripada kode yang sepenuhnya tervectorisasi.
# library(microbenchmark)
# x <- runif(5000, 1, 100)
#
# mb <- microbenchmark(
# for_loop = {
# r <- numeric(length(x))
# for (i in seq_along(x)) r[i] <- log(x[i])
# },
# sapply_log = sapply(x, log),
# vapply_log = vapply(x, log, numeric(1)),
# vec_log = log(x),
# times = 200L, unit = 'us'
# )
# print(mb)Memeriksa Kebenaran Terlebih Dahulu
Sebelum melakukan benchmarking, pastikan semua ekspresi mengembalikan hasil yang identik. Implementasi yang lebih cepat tetapi salah tidak berguna. Gunakan identical() atau all.equal() untuk membandingkan keluaran.
# x <- runif(1000)
# r1 <- sapply(x, sqrt)
# r2 <- sqrt(x)
# r3 <- vapply(x, sqrt, numeric(1))
#
# stopifnot(isTRUE(all.equal(r1, r2)))
# stopifnot(isTRUE(all.equal(r1, r3)))
# cat('All three produce identical results -- safe to benchmark
')
cat('Always verify correctness before comparing speed
')Benchmarking dengan Argumen setup
Gunakan argumen setup untuk menjalankan kode sekali sebelum ekspresi yang diukur waktunya. Dengan begitu, waktu pembuatan data tidak ikut dihitung jika pembuatan data bukan hal yang sedang Anda ukur.
# library(microbenchmark)
#
# microbenchmark(
# sort_base = sort(x),
# sort_order = x[order(x)],
# setup = { x <- rnorm(10000) },
# times = 100L
# )
# Each iteration refreshes x via setup, then times sort_base and sort_orderMelaporkan Benchmark dalam Analisis
Saat membagikan hasil benchmark, selalu laporkan:
- Versi dan platform R
- Versi paket
- Nilai
timesyang digunakan - Ukuran data yang diukur
Waktu eksekusi tidak dapat dibandingkan langsung antar-komputer—laporkan rasio, bukan angka absolut, saat membandingkan implementasi.
cat('R version :', R.version$version.string, '
')
cat('Platform :', R.version$platform, '
')
cat('Logical cores:', parallel::detectCores(), '
')Pemeriksaan Cepat: Metrik microbenchmark
Statistik ringkasan mana dari keluaran microbenchmark yang paling andal untuk membandingkan dua implementasi?
Ikhtisar microbenchmark
microbenchmark adalah alat standar untuk microbenchmarking yang ketat dalam R:
- Berikan ekspresi bernama dan atur
timesuntuk mengendalikan jumlah pengulangan - Gunakan
unit = 'us'atau'ms'agar keluaran mudah dibaca - Bandingkan median karena tahan terhadap pencilan GC
- Gunakan
autoplot()untuk memvisualisasikan distribusi waktu - Verifikasi kebenaran dengan
all.equal()sebelum melakukan benchmarking
Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menguji Kinerja dengan microbenchmark” gratis?
Ya — teks lengkap “Menguji Kinerja dengan microbenchmark” 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 “Menguji Kinerja dengan microbenchmark”?
Bandingkan beberapa implementasi secara statistik dengan microbenchmark(). 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 4 dari 4.
Berapa lama pelajaran “Menguji Kinerja dengan microbenchmark” 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
- system.time() dan proc.time()
- Membuat Profil Kode dengan Rprof dan profvis
- Vektorisasi untuk Kecepatan
- Menguji Kinerja dengan microbenchmark