মূল কন্টেন্টে যান
মডিউল 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 ???
উত্তরের বিকল্প