मॉड्यूल पाठ (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 ???