0Pricing
Go Academy · درس

تقليل التخصيصات: ‏sync.Pool وArenas

إعادة استخدام الكائنات وsync.Pool وتقليل الضغط على GC

تقليل التخصيصات: ‏sync.Pool وArenas درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

لماذا نقلّل عمليات التخصيص؟

كل تخصيص على الكومة يؤدي في النهاية إلى عمل إضافي لـ GC. ويؤدي تقليل عمليات التخصيص إلى خفض معدل تشغيل GC ومدد التوقف، مما يحسّن الإنتاجية وزمن الاستجابة في الطرف الأعلى من التوزيع في الخدمات ذات الحركة الكثيفة.

التنميط أولًا

أجرِ التنميط دائمًا قبل التحسين. استخدم go test -benchmem وملفات تعريف الكومة باستخدام -alloc_space للعثور على مسارات التخصيص الفعلية التي تستهلك أكبر قدر من الوقت. لا تُجرِ التحسينات اعتمادًا على الحدس.

sync.Pool

sync.Pool هو مجمّع آمن للاستخدام مع الخيوط للكائنات القابلة لإعادة الاستخدام. استخدمه للكائنات قصيرة العمر التي تُخصّص وتُتخلّص منها بصورة متكررة، مثل مخازن البايتات وخرائط العمل المؤقتة وسياقات الطلبات.

var pool = sync.Pool{
    New: func() any { return &bytes.Buffer{} },
}
func process(data []byte) {
    buf := pool.Get().(*bytes.Buffer)
    buf.Reset()
    buf.Write(data)
    // use buf...
    pool.Put(buf)
}

Pool ليس ذاكرة تخزين مؤقت

قد يمسح GC عناصر المجمّع في أي وقت. صُمّم Pool لتقليل ضغط التخصيص، وليس لتخزين البيانات طويلة العمر مؤقتًا. وقد تكون الكائنات المستردة من أي goroutine.

استدعِ Reset دائمًا قبل إعادة الاستخدام

امسح الكائنات المجمّعة قبل استخدامها، فقد تحتوي على بيانات من مستدعٍ سابق. بالنسبة إلى bytes.Buffer، استدعِ Reset()؛ وبالنسبة إلى الشرائح، أعد تقطيعها إلى [:0].

التخصيص المسبق للشرائح

خصّص الشرائح مسبقًا باستخدام make([]T, 0, n) عندما يكون الطول النهائي معروفًا. يمنع ذلك عمليات التضاعف والنسخ المتكررة مع نمو الشريحة.

results := make([]Result, 0, len(input)) // no reallocations

منشئ السلاسل النصية

استخدم strings.Builder بدلًا من تسلسل السلاسل النصية لتجنّب تخصيص سلاسل وسيطة داخل الحلقات:

var sb strings.Builder
for _, s := range parts { sb.WriteString(s) }
result := sb.String()

تجميع bytes.Buffer

يُعد bytes.Buffer أحد أكثر الأنواع استخدامًا في التجميع. جمّعه لتجنّب التخصيص المتكرر أثناء ترميز JSON وبناء استجابات HTTP وعرض القوالب.

ساحات Go (تجريبية)

يتضمن Go 1.20 والإصدارات الأحدث حزمة ساحات تجريبية (golang.org/x/exp/arena). تخصّص الساحات العديد من الكائنات في كتلة كبيرة واحدة تُحرَّر دفعة واحدة، متجاوزةً GC الخاص بكل كائن.

أنواع القيم

تتجنب البُنى الصغيرة التي تُمرَّر بالقيمة تخصيص الكومة بالكامل. تجنّب أنماط المؤشرات إلى البُنى الصغيرة في الشيفرة الحساسة للأداء؛ فكثيرًا ما يكون إرجاع القيم أقل تكلفة.

قياس التأثير

شغّل اختبارات الأداء باستخدام -benchmem قبل التحسين وبعده، وقارن النتائج باستخدام benchstat. استهدف تقليل allocs/op في المسار الحرج، وليس ns/op فقط.

BenchmarkProcess-8  1000000  125 ns/op  64 B/op  2 allocs/op
// After pooling:
BenchmarkProcess-8  1000000   48 ns/op   0 B/op  0 allocs/op

تحقق سريع

ما السمة الأساسية التي تجعل sync.Pool آمنًا لتقليل عمليات التخصيص؟

مراجعة: تقليل عمليات التخصيص

النقاط الأساسية:

  • أجرِ التنميط أولًا: استخدم -benchmem وملفات تعريف الكومة -alloc_space قبل التحسين
  • استخدم sync.Pool للكائنات التي تُخصّص وتُتخلّص منها كثيرًا؛ واستدعِ Reset دائمًا قبل إعادة الاستخدام
  • خصّص الشرائح مسبقًا باستخدام make([]T, 0, n)، واستخدم strings.Builder للتسلسل
  • تتجنب أنواع القيم تخصيص الكومة؛ استخدم اختبارات الأداء للتحقق من التحسينات

الأسئلة الشائعة

هل درس «تقليل التخصيصات: ‏sync.Pool وArenas» مجاني؟

نعم — نص درس «تقليل التخصيصات: ‏sync.Pool وArenas» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «تقليل التخصيصات: ‏sync.Pool وArenas»؟

إعادة استخدام الكائنات وsync.Pool وتقليل الضغط على GC تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تقليل التخصيصات: ‏sync.Pool وArenas»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. المكدس مقابل الكومة وتحليل الهروب
  2. نموذج ذاكرة Go وترتيب Happens-Before
  3. الأجزاء الداخلية لجمع البيانات المهملة
  4. تقليل التخصيصات: ‏sync.Pool وArenas
← العودة إلى Go Academy