ماڈیول اسباق (3/5)
بینچ مارکس اور پروفائلز
فنکشنل ٹیسٹوں کے علاوہ، go test میں بلٹ ان بینچ مارکس (BenchmarkXxx) بھی ہیں اور CPU اور میموری پروفائلز (pprof) کو سپورٹ کرتا ہے۔ تمام بیرونی انحصار کے بغیر۔
بینچ مارک کی شکل
func BenchmarkSum(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = Sum(2, 3)
}
}خصوصیات:
- بالکل درست دستخط:
func BenchmarkXxx(b *testing.B)۔ - لوپ کو چلنا چاہیے
b.Nتکرار: فریم ورک خود بخودb.Nکو ایڈجسٹ کرتا ہے، 1 سے شروع ہوتا ہے اور پیمائش کے مستحکم ہونے تک بڑھتا رہتا ہے (~1 سیکنڈ بذریعہ ڈیفالٹ)۔ - نتیجہ ہے
ns/op(نینو سیکنڈ فی آپریشن) اور،-benchmemکے ساتھ،B/opاورallocs/opبھی۔
عام احکامات
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 profileعام پیداوار:
BenchmarkSum-8 1000000000 0.31 ns/op
-8 GOMAXPROCS قدر ہے۔ 0.31 ns/op فی کال اوسط وقت ہے۔
مہنگا سیٹ اپ: b.ResetTimer
اگر آپ کے پاس لوپ سے پہلے تیاری کا ایک طویل مرحلہ ہے، تو اسے پیمائش سے خارج کر دیں:
func BenchmarkSearch(b *testing.B) {
data := buildLargeSlice(1_000_000) // expensive
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = Search(data, 42)
}
}مفید متغیرات:
b.StopTimer()/b.StartTimer()— پیمائش کو ایک غیر دلچسپ مرحلے کے ارد گرد روک دیں (لوپ کے اندر آسان)۔b.ReportAllocs()—-benchmemکے بغیر بھی جبری ایلوکیشن رپورٹنگ۔
b.Run کے ساتھ بینچ مارک ٹیبل
جیسے ٹیسٹ کے لیے t.Run، پیرامیٹرک بینچ مارکس کے لیے b.Run ہے:
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، ... اسکیلنگ چارٹس کے لیے مثالی۔
benchstat کے ساتھ دو نفاذ کا موازنہ
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 میں) اوسط، معیاری انحراف اور فرق کی شماریاتی اہمیت کا حساب لگاتا ہے۔
مشقیں
بینچ مارک سم کی وضاحت کریں لوپ اوور b.N کے ساتھ جو Sum(2, 3) کو کہتے ہیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مہنگے سیٹ اپ کے بعد، لوپ سے پہلے b.ResetTimer شامل کریں، تاکہ سیٹ اپ پیمائش میں شامل نہ ہو۔
3 کوششوں کے بعد حل دستیاب ہے۔
کون سا جھنڈا پیکیج میں تمام معیارات کو چلاتا ہے؟
$ go test ???