Menulis Benchmark dengan testing.B
BenchmarkXxx, perulangan b.N, dan flag -bench
Menulis Benchmark dengan testing.B adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 1 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 Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Tanda tangan fungsi tolok ukur
Tolok ukur diawali dengan Benchmark dan menerima *testing.B. Tolok ukur dijalankan dalam berkas _test.go bersama pengujian biasa.
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}b.N
Kerangka pengujian secara otomatis menyesuaikan b.N—jumlah iterasi perulangan—hingga tolok ukur berjalan setidaknya selama 1 detik, sehingga menghasilkan angka nanodetik per operasi yang stabil.
Menjalankan tolok ukur
Tolok ukur tidak dijalankan hanya dengan go test. Gunakan -bench untuk mengaktifkannya:
go test -bench=. -benchmem ./...
// BenchmarkAdd-8 500000000 2.13 ns/op 0 B/op 0 allocs/opFlag -benchmem
-benchmem menambahkan statistik alokasi: byte per operasi dan jumlah alokasi per operasi. Alokasi yang tinggi sering menunjukkan masalah kinerja.
b.ResetTimer
Panggil b.ResetTimer() setelah penyiapan yang mahal dan tidak boleh dihitung dalam tolok ukur:
func BenchmarkQuery(b *testing.B) {
db := setupDB() // expensive
b.ResetTimer()
for i := 0; i < b.N; i++ {
db.Query("SELECT 1")
}
}b.StopTimer / b.StartTimer
Jeda dan lanjutkan pewaktu di sekitar penyiapan atau pembongkaran yang tidak boleh dihitung dalam waktu tolok ukur.
for i := 0; i < b.N; i++ {
b.StopTimer()
data := generateInput()
b.StartTimer()
process(data)
}b.SetBytes
Panggil b.SetBytes(n) untuk melaporkan laju pemrosesan (byte/detik) selain waktu per operasi. Berguna untuk mengukur kinerja serialisasi atau kode jaringan.
b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
encode(payload)
}Membandingkan tolok ukur
Gunakan benchstat untuk membandingkan dua eksekusi tolok ukur dan melihat perbedaan yang signifikan secara statistik:
go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txtMencegah eliminasi kode mati
Tetapkan hasil ke variabel tingkat paket atau penampung untuk mencegah kompiler mengoptimalkan kode yang diukur hingga terhapus:
var result int
func BenchmarkFib(b *testing.B) {
for i := 0; i < b.N; i++ {
result = Fib(20)
}
}Tolok ukur turunan
Gunakan b.Run untuk membuat tolok ukur turunan bernama, serupa dengan pengujian berbasis tabel:
for _, size := range []int{10, 100, 1000} {
b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
for i := 0; i < b.N; i++ { sort(make([]int, size)) }
})
}Tolok ukur vs pembuatan profil
Tolok ukur mengukur kinerja secara kuantitatif. Pembuatan profil (pprof) menunjukkan di mana waktu digunakan. Gunakan tolok ukur untuk mengukur; gunakan pembuatan profil untuk mendiagnosis bagian yang perlu dioptimalkan.
Pemeriksaan singkat
Mengapa isi perulangan tolok ukur harus menggunakan hasilnya agar tidak dioptimalkan oleh kompiler?
Ringkasan: Tolok ukur
Poin utama:
- BenchmarkXxx(b *testing.B) dengan for i := 0; i < b.N; i++
- go test -bench=. -benchmem untuk statistik alokasi
- b.ResetTimer() setelah penyiapan yang mahal
- Gunakan benchstat untuk membandingkan eksekusi; tetapkan hasil untuk mencegah penghapusan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menulis Benchmark dengan testing.B” gratis?
Ya — teks lengkap “Menulis Benchmark dengan testing.B” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menulis Benchmark dengan testing.B”?
BenchmarkXxx, perulangan b.N, dan flag -bench Kamu berlatih Go 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 Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go 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 1 dari 4.
Berapa lama pelajaran “Menulis Benchmark dengan testing.B” 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 Go Academy ini?
Ya. Setiap pelajaran Go 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
- Menulis Benchmark dengan testing.B
- Pembuatan Profil CPU dengan pprof
- Pembuatan Profil Heap dan Alokasi
- Pelacakan Eksekusi