كتابة المعايير باستخدام testing.B
BenchmarkXxx وحلقة b.N وخيار -bench
كتابة المعايير باستخدام testing.B درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
توقيع دالة Benchmark
تبدأ اختبارات Benchmark بـ Benchmark وتستقبل *testing.B. وتُشغَّل في ملف _test.go إلى جانب الاختبارات العادية.
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}b.N
يعدّل إطار الاختبار تلقائيًا قيمة b.N — أي عدد تكرارات الحلقة — حتى يستمر الاختبار لمدة ثانية واحدة على الأقل، ما ينتج قيمة مستقرة للنانوثانية لكل عملية.
تشغيل اختبارات Benchmark
لا تُشغَّل اختبارات Benchmark باستخدام go test وحده. استخدموا -bench لتمكينها:
go test -bench=. -benchmem ./...
// BenchmarkAdd-8 500000000 2.13 ns/op 0 B/op 0 allocs/opالخيار -benchmem
يضيف -benchmem إحصاءات التخصيص: عدد البايتات لكل عملية وعدد عمليات التخصيص لكل عملية. وغالبًا ما تشير كثرة التخصيصات إلى مشكلات في الأداء.
b.ResetTimer
استدعوا b.ResetTimer() بعد الإعداد المكلف الذي لا ينبغي احتسابه ضمن اختبار Benchmark:
func BenchmarkQuery(b *testing.B) {
db := setupDB() // expensive
b.ResetTimer()
for i := 0; i < b.N; i++ {
db.Query("SELECT 1")
}
}b.StopTimer / b.StartTimer
أوقفوا المؤقت مؤقتًا واستأنفوه حول عمليات الإعداد والتنظيف التي لا ينبغي أن تُحتسب ضمن وقت اختبار Benchmark.
for i := 0; i < b.N; i++ {
b.StopTimer()
data := generateInput()
b.StartTimer()
process(data)
}b.SetBytes
استدعوا b.SetBytes(n) لعرض معدل النقل (بايت/ثانية) بالإضافة إلى الوقت لكل عملية. ويفيد ذلك في قياس أداء كود التسلسل أو كود الشبكة.
b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
encode(payload)
}مقارنة اختبارات Benchmark
استخدموا benchstat لمقارنة تشغيلين لاختبار Benchmark ومعرفة الفروق ذات الدلالة الإحصائية:
go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txtمنع حذف الكود غير المستخدم
أسندوا النتيجة إلى متغير على مستوى الحزمة أو إلى متغير sink لمنع المترجم من تحسين الكود الذي يجري قياسه وإزالته:
var result int
func BenchmarkFib(b *testing.B) {
for i := 0; i < b.N; i++ {
result = Fib(20)
}
}اختبارات Benchmark الفرعية
استخدموا b.Run لإنشاء اختبارات Benchmark فرعية ذات أسماء، على نحو مشابه للاختبارات المعتمدة على الجداول:
for _, size := range []int{10, 100, 1000} {
b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
for i := 0; i < b.N; i++ { sort(make([]int, size)) }
})
}اختبار Benchmark مقابل التنميط
تحدد اختبارات Benchmark الأداء كميًا، بينما يوضح التنميط (pprof) المواضع التي يُستهلك فيها الوقت. استخدموا اختبارات Benchmark للقياس، والتنميط لتحديد مواضع التحسين.
تحقق سريع
لماذا يجب أن يستخدم جسم حلقة Benchmark النتيجة لمنع تحسين المترجم للكود؟
مراجعة: اختبارات Benchmark
النقاط الأساسية:
- BenchmarkXxx(b *testing.B) مع for i := 0; i < b.N; i++
- go test -bench=. -benchmem لإحصاءات التخصيص
- b.ResetTimer() بعد الإعداد المكلف
- استخدموا benchstat لمقارنة عمليات التشغيل؛ وأسندوا النتائج لمنع حذفها
تعلم Go مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «كتابة المعايير باستخدام testing.B» مجاني؟
نعم — نص درس «كتابة المعايير باستخدام testing.B» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «كتابة المعايير باستخدام testing.B»؟
BenchmarkXxx وحلقة b.N وخيار -bench تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «كتابة المعايير باستخدام testing.B»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة المعايير باستخدام testing.B
- إنشاء ملفات تعريف أداء CPU باستخدام pprof
- إنشاء ملفات تعريف الذاكرة والتخصيص
- تتبّع التنفيذ