మాడ్యూల్ పాఠాలు (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లో) వ్యత్యాసం యొక్క సగటు, ప్రామాణిక విచలనం మరియు గణాంక ప్రాముఖ్యతను గణిస్తుంది.
వ్యాయామాలు
సమ్(2, 3) అని పిలిచే b.N పై లూప్తో BenchmarkSumని నిర్వచించండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
లూప్కు ముందు ఖరీదైన సెటప్ తర్వాత b.ResetTimerని జోడించండి, కాబట్టి సెటప్ కొలతలో చేర్చబడలేదు.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
ప్యాకేజీలోని అన్ని బెంచ్మార్క్లను ఏ ఫ్లాగ్ అమలు చేస్తుంది?
$ go test ???