ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 9 · 5లో పాఠం 3కోర్సులో 43/50~12 min
మాడ్యూల్ పాఠాలు (3/5)

బెంచ్‌మార్క్‌లు మరియు ప్రొఫైల్‌లు

ఫంక్షనల్ పరీక్షలతో పాటు, go test అంతర్నిర్మిత బెంచ్‌మార్క్‌లను (BenchmarkXxx) కలిగి ఉంది మరియు CPU మరియు మెమరీ ప్రొఫైల్‌లకు (pprof) మద్దతు ఇస్తుంది. అన్నీ బాహ్య డిపెండెన్సీలు లేకుండా.

బెంచ్‌మార్క్ ఆకారం

Go
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.

సాధారణ ఆదేశాలు

Bash
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

సాధారణ అవుట్‌పుట్:

Code
BenchmarkSum-8        1000000000        0.31 ns/op

-8 అనేది GOMAXPROCS విలువ. 0.31 ns/op ఒక కాల్‌కి సగటు సమయం.

ఖరీదైన సెటప్: b.ResetTimer

మీరు లూప్‌కు ముందు సుదీర్ఘ తయారీ దశను కలిగి ఉంటే, దానిని కొలత నుండి మినహాయించండి:

Go
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 ఉంది:

Go
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తో రెండు అమలులను పోల్చడం

Bash
go test -bench=. -count=10 > old.txt
# apply change
go test -bench=. -count=10 > new.txt
benchstat old.txt new.txt

benchstat (golang.org/x/perf/cmd/benchstatలో) వ్యత్యాసం యొక్క సగటు, ప్రామాణిక విచలనం మరియు గణాంక ప్రాముఖ్యతను గణిస్తుంది.

వ్యాయామాలు

వ్యాయామం#go.m9.l3.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

సమ్(2, 3) అని పిలిచే b.N పై లూప్‌తో BenchmarkSumని నిర్వచించండి.

ఎడిటర్ లోడ్ అవుతోంది…

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#go.m9.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

లూప్‌కు ముందు ఖరీదైన సెటప్ తర్వాత b.ResetTimerని జోడించండి, కాబట్టి సెటప్ కొలతలో చేర్చబడలేదు.

ఎడిటర్ లోడ్ అవుతోంది…

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

Quiz#go.m9.l3.e3
సిద్ధంగా ఉంది

ప్యాకేజీలోని అన్ని బెంచ్‌మార్క్‌లను ఏ ఫ్లాగ్ అమలు చేస్తుంది?

Go
$ go test ???
సమాధాన ఎంపికలు