Benchmark đo thời gian trung bình mỗi vòng lặp trên b.N vòng do framework tự tăng dần.
Số liệu sai chủ yếu do đo nhầm phần setup hoặc do compiler tối ưu mất phần cần đo.
func BenchmarkParse(b *testing.B) {
data := loadFixture() // setup tốn kém
b.ResetTimer() // bỏ thời gian setup ra khỏi phép đo
b.ReportAllocs()
for i := 0; i < b.N; i++ {
sink, _ = Parse(data)
}
}
var sink Result // biến package-level chặn compiler loại bỏ lời gọiCác lỗi hay gặp:
- Đặt setup trong vòng lặp → đo cả chi phí không liên quan. Nếu setup nằm giữa vòng thì dùng b.StopTimer / b.StartTimer.
- Bỏ kết quả đi (_ = Parse(data)): compiler có thể loại bỏ hoàn toàn lời gọi, benchmark ra vài nanosecond. Gán vào biến package-level (sink) để chặn.
- Hiểu b.N là số vòng cố định. Nó thay đổi giữa các lần chạy; đừng chia hay nhân thủ công.
- Chỉ chạy một lần rồi kết luận. Dùng -benchtime, -count=10 rồi so sánh bằng benchstat; chênh lệch dưới nhiễu đo là không có ý nghĩa.
- Quên -benchmem (hoặc b.ReportAllocs) → mất cột B/op và allocs/op, vốn thường là nguyên nhân thật của chậm.
b.RunParallel dùng khi cần đo dưới tải nhiều goroutine; còn đo trên máy dev có nhiễu thì nên cố định tần số CPU hoặc chạy trên môi trường ổn định.