முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 9 · பாடம் 3 இன் 5பாடத்திட்டத்தில் 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ஏற்றுகிறது…

Sum(2, 3) ஐ அழைக்கும் b.N மேல் உள்ள வளையத்துடன் BenchmarkSum ஐ வரையறுக்கவும்.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m9.l3.e2
முயற்சிகள்: 0ஏற்றுகிறது…

லூப்பிற்கு முன் விலையுயர்ந்த அமைப்பிற்குப் பிறகு b.ResetTimer ஐச் சேர்க்கவும், எனவே அமைப்பு அளவீட்டில் சேர்க்கப்படவில்லை.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m9.l3.e3
தயார்

தொகுப்பில் உள்ள அனைத்து வரையறைகளையும் எந்தக் கொடி இயக்குகிறது?

Go
$ go test ???
பதில் விருப்பங்கள்