Go Academy · درس

كتابة المعايير باستخدام testing.B

‏BenchmarkXxx وحلقة b.N وخيار -bench

الدرس 1 من 413 خطوة

كتابة المعايير باستخدام 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كتابة المعايير باستخدام testing.B
  2. إنشاء ملفات تعريف أداء CPU باستخدام pprof
  3. إنشاء ملفات تعريف الذاكرة والتخصيص
  4. تتبّع التنفيذ
← العودة إلى Go Academy