মডিউল পাঠ (3/5)
বেঞ্চমার্ক এবং প্রোফাইল
কার্যকরী পরীক্ষাগুলি ছাড়াও, go test এর বিল্ট-ইন বেঞ্চমার্ক (BenchmarkXxx) রয়েছে এবং CPU এবং মেমরি প্রোফাইলগুলিকে সমর্থন করে (pprof)। সব বাহ্যিক নির্ভরতা ছাড়া.
বেঞ্চমার্কের আকৃতি
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।
সাধারণ আদেশ
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সাধারণ আউটপুট:
BenchmarkSum-8 1000000000 0.31 ns/op
-8 হল GOMAXPROCS মান। 0.31 ns/op হল প্রতি কলের গড় সময়।
ব্যয়বহুল সেটআপ: b.ResetTimer
লুপের আগে যদি আপনার একটি দীর্ঘ প্রস্তুতির ধাপ থাকে, তাহলে পরিমাপ থেকে এটি বাদ দিন:
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 আছে:
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 এর সাথে দুটি বাস্তবায়নের তুলনা করা হচ্ছে
go test -bench=. -count=10 > old.txt
# apply change
go test -bench=. -count=10 > new.txt
benchstat old.txt new.txtbenchstat (golang.org/x/perf/cmd/benchstat এ) গড়, মানক বিচ্যুতি এবং পার্থক্যের পরিসংখ্যানগত তাৎপর্য গণনা করে।
ব্যায়াম
B.N এর উপর লুপ দিয়ে বেঞ্চমার্কসাম সংজ্ঞায়িত করুন যা Sum(2, 3) কে কল করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যয়বহুল সেটআপের পরে, লুপের আগে b.ResetTimer যোগ করুন, তাই সেটআপটি পরিমাপের মধ্যে অন্তর্ভুক্ত নয়।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
কোন পতাকা প্যাকেজের সমস্ত বেঞ্চমার্ক চালায়?
$ go test ???