يحدث الآن تحويل قيم عدد صحيح صغير إلى الواجهة بدون تخصيصات.في هذا المنشور القصير سأخبرك ما هو التحسين.
كيف تعمل الواجهة {} في Go
لفهم كيفية عمل هذا التحسين ، يلزمك تحسين واجهة {} الجهاز في Go. لن أتعمق في هذا الموضوع كثيرًا ، فقط تذكر الأفكار الرئيسية.
يوجد داخل src / runtime / runtime2.go هيكل مثل هذا:
type iface struct {
tab *itab
data unsafe.Pointer
}
هذه هي واجهتنا. في الواقع ، الواجهة {} عبارة عن مؤشرين فقط:
- البيانات - مؤشر إلى البيانات نفسها التي تم تخصيص الذاكرة لها على الكومة
- علامة التبويب - معلومات تعريفية حول الواجهة ونوع القاعدة
نحن نتخيل المعرفة المكتسبة والمضي قدمًا.
ما هي المشكلة الفعلية
في Go ، يعد تخصيص أشياء جديدة في الورك أمرًا مكلفًا. لذلك ، إذا كنت تريد كتابة كود إنتاجي ، فستواجه بالتأكيد هذه المشكلة. لذلك ، يمكن لأي تحسينات طفيفة ، حتى للوهلة الأولى ، تحسين أداء التطبيق بأكمله.
المشكلة التي تحلها عملية التحسين المدروسة هي أنها عملية مضيعة لتخصيص كائنات لأعداد صحيحة صغيرة.
كيف تم حلها
هذا ما فعله الرجال في Go. في حزمة وقت التشغيل ، كان لديهم بالفعل مصفوفة ثابتة من الأعداد الصحيحة من 0 إلى 255. في اللحظة التي يتم فيها تحويل عدد صحيح إلى واجهة {} ، يتم التحقق مما إذا كان هذا الرقم في النطاق المحدد ، وإذا كان الأمر كذلك ، مؤشر إلى عنصر في هذه المجموعة. هذا يلغي التخصيص غير الضروري.
تستطيع أن ترى التغييرات على الجهاب .
هذه الأنواع من التحسينات ليست جديدة في Go. لذلك ، إذا قمت بإنشاء سلسلة ascii من حرف واحد ، فلن يكون هناك تخصيصات للذاكرة. لن يكون هناك كل منهم وفقًا لنفس السيناريو: يحتوي وقت تشغيل Go على مصفوفة ثابتة من سلاسل مكونة من حرف واحد. بالمناسبة ، لا تقلق ، لأنه في الوقت الحاضر هناك مصفوفة واحدة ثابتة من القيم من 0 إلى 255 موجودة في وقت التشغيل. يتم إعادة استخدامها لتمثيل السلسلة.