مرکزی مواد پر جائیں
ماڈیول 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لوڈ ہو رہا ہے…

بینچ مارک سم کی وضاحت کریں لوپ اوور b.N کے ساتھ جو Sum(2, 3) کو کہتے ہیں۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m9.l3.e2
کوششیں: 0لوڈ ہو رہا ہے…

مہنگے سیٹ اپ کے بعد، لوپ سے پہلے b.ResetTimer شامل کریں، تاکہ سیٹ اپ پیمائش میں شامل نہ ہو۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m9.l3.e3
تیار

کون سا جھنڈا پیکیج میں تمام معیارات کو چلاتا ہے؟

Go
$ go test ???
جواب کے اختیارات