मुख्य सामग्री पर जाएं
मॉड्यूल 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 ???
उत्तर विकल्प