Advanced Benchmarking
Ilg'or benchmarking
Benchmark yozishda ba'zi nozik jihatlarni bilish, natijani noto'g'ri o'lchashning oldini oladi.
package main
import (
"strings"
"testing"
)
func BuildString(n int) string {
var b strings.Builder
for i := 0; i < n; i++ {
b.WriteString("x")
}
return b.String()
}
func BenchmarkBuildString(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
BuildString(1000)
}
}
func BenchmarkBuildStringSizes(b *testing.B) {
sizes := []int{10, 100, 1000}
for _, size := range sizes {
b.Run(strings.Repeat("x", 1), func(b *testing.B) {
for i := 0; i < b.N; i++ {
BuildString(size)
}
})
}
}b.ResetTimer() — agar benchmark boshida sikldan tashqarida sekin "tayyorgarlik" kodi bo'lsa (masalan katta test ma'lumotini yaratish), soatni shu tayyorgarlikdan keyin qaytadan nolga tashlaydi — aks holda tayyorgarlik vaqti ham "benchmark natijasi"ga noto'g'ri qo'shilib ketadi. b.Run esa xuddi t.Run kabi, benchmark'ni turli parametrlar (masalan turli hajmlar) bilan alohida-alohida o'lchash imkonini beradi — masalan "kichik kirish tezmi yoki katta kirish tezmi?" degan savolga javob berish uchun.
Yana bir muhim maslahat: b.ReportAllocs() chaqirilsa, benchmark har bir chaqiruvda nechta xotira ajratish (allocation) bo'lganini ham hisoblab beradi — bu ko'pincha vaqtning o'zidan ham muhimroq, chunki ortiqcha xotira ajratish garbage collectorga ortiqcha yuk beradi.
Key Takeaway
Key Takeaway:
b.ResetTimer() tayyorgarlik vaqtini o'lchovdan chiqaradi, b.Run esa turli holatlarni alohida taqqoslash imkonini beradi — ikkalasi ham to'g'ri, ishonchli benchmark natijasi olish uchun muhim.
NEXT UP
Code Coverage