Modül dersleri (3/5)
Karşılaştırmalar ve profiller
İşlevsel testlere ek olarak go test aynı zamanda yerleşik kıyaslamalara (BenchmarkXxx) sahiptir ve CPU ve bellek profillerini (pprof) destekler. Hepsi dışa bağımlılık olmadan.
Bir kıyaslama şekli
func BenchmarkSum(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = Sum(2, 3)
}
}Özellikler:
- Tam imza:
func BenchmarkXxx(b *testing.B). - Döngü
b.Nyinelemeleri çalıştırmalıdır: çerçeve,b.N'yi otomatik olarak ayarlar, 1'den başlar ve ölçüm stabil hale gelene kadar büyür (varsayılan olarak ~1 saniye). - Sonuç
ns/op(işlem başına nanosaniye) ve-benchmemile ayrıcaB/opveallocs/opolur.
Tipik komutlar
go test -bench=. ./... # all benchmarks
go test -bench=Sum -benchmem # only Sum, with memory info
go test -bench=. -benchtime=5s # each benchmark for 5 seconds
go test -bench=. -cpuprofile=cpu.out # generate a CPU profileTipik çıktı:
BenchmarkSum-8 1000000000 0.31 ns/op
-8, GOMAXPROCS değeridir. 0.31 ns/op çağrı başına ortalama süredir.
Pahalı kurulum: b.ResetTimer
Döngüden önce uzun bir hazırlık adımınız varsa, bunu ölçümden hariç tutun:
func BenchmarkSearch(b *testing.B) {
data := buildLargeSlice(1_000_000) // expensive
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = Search(data, 42)
}
}Faydalı çeşitler:
b.StopTimer()/b.StartTimer()— ilgi çekici olmayan bir aşamada ölçümü duraklatın (döngü içinde kullanışlıdır).b.ReportAllocs()—-benchmemolmasa bile tahsis raporlamasını zorlayın.
b.Run ile karşılaştırma tablosu
Tıpkı testler için t.Run gibi, parametrik kıyaslamalar için de b.Run vardır:
func BenchmarkSplit(b *testing.B) {
for _, size := range []int{10, 1000, 100000} {
b.Run(fmt.Sprintf("n=%d", size), func(b *testing.B) {
s := strings.Repeat("a,", size)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = strings.Split(s, ",")
}
})
}
}BenchmarkSplit/n=10-8, BenchmarkSplit/n=1000-8 gibi satırların çıktısını alın, ... grafiklerin ölçeklendirilmesi için idealdir.
İki uygulamayı benchstat ile karşılaştırma
go test -bench=. -count=10 > old.txt
# apply change
go test -bench=. -count=10 > new.txt
benchstat old.txt new.txtbenchstat (golang.org/x/perf/cmd/benchstat içinde) farkın ortalamasını, standart sapmasını ve istatistiksel önemini hesaplar.
Egzersizler
BenchmarkSum'u, Sum(2, 3)'ü çağıran b.N üzerindeki döngüyle tanımlayın.
3 denemeden sonra çözüm mevcut
Pahalı kurulumdan SONRA döngüden önce b.ResetTimer'ı ekleyin, böylece kurulum ölçüme dahil edilmez.
3 denemeden sonra çözüm mevcut
Paketteki tüm kriterleri hangi bayrak çalıştırır?
$ go test ???