تخصيص الذاكرة في Cمكلف نسبيًا ، وهو نقطة رئيسية للتحسين لأي تطبيق مهم للأداء. تجميع الكائنات هو أحد الأساليب التي يمكن أن تساعد في تقليل الحمل الزائد للتطبيق كثيف الذاكرة.
كيف يعمل تجميع الكائنات على تحسين الأداء؟
في نهاية اليوم ، يقتصر أداء أجهزة الكمبيوتر بشكل أساسي على شيئين: سرعة معالجة وحدة المعالجة المركزية وأداء الذاكرة. يمكن تحسين الأول باستخدام خوارزميات أكثر كفاءة تستخدم دورات ساعة أقل ، ولكن غالبًا ما يكون من الصعب تحسين استخدام الذاكرة ، خاصة عند العمل مع مجموعات بيانات كبيرة ومقاييس زمنية قصيرة جدًا.
تجميع الكائنات هي تقنية تستخدم لتقليل تخصيصات الذاكرة. غالبًا ما لا توجد طريقة للتغلب على الحاجة إلى تخصيص الذاكرة ، ولكن قد لا تحتاج إلى التخصيص كثيرًا كما تفعل. تكون عمليات تخصيص الكائنات بطيئة لعدة أسباب - يتم تخصيص الذاكرة الأساسية في كومة الذاكرة المؤقتة (وهي أبطأ كثيرًا من عمليات تخصيص مكدس من نوع القيمة) ، ويمكن أن تحتوي الكائنات المعقدة على مُنشئين كثيف الأداء. بالإضافة إلى ذلك ، نظرًا لأنها ذاكرة تستند إلى كومة ، سيحتاج جهاز تجميع البيانات المهملة إلى تنظيفها ، مما قد يضر بالأداء إذا كنت تقوم بتشغيله كثيرًا.
على سبيل المثال ، لنفترض أن لديك حلقة يتم تشغيلها عدة مرات ، وتخصص كائنًا جديدًا مثل القائمة لكل عملية تنفيذ. يتم استخدام الكثير من الذاكرة ، ولا يتم تنظيفها إلا بعد انتهاء كل شيء وتشغيل عملية جمع البيانات المهملة. سيتم تشغيل الكود التالي 10000 مرة ، وترك 10000 قائمة بدون مالك مخصصة في الذاكرة في نهاية الوظيفة.

عندما يتم تشغيل أداة تجميع القمامة في النهاية ، سيكون من الصعب جدًا تنظيف كل هذه النفايات ، مما سيؤثر سلبًا على الأداء أثناء انتظار انتهاء GC.
بدلاً من ذلك ، تتمثل الطريقة الأكثر منطقية في تهيئته مرة واحدة ، وإعادة استخدام الكائن. هذا يضمن أنك تعيد استخدام نفس المساحة في الذاكرة ، بدلاً من نسيانها والسماح لمجمع القمامة بالتعامل معها. إنه ليس سحرًا ، وعليك تنظيفه في النهاية.
في هذا المثال ، سيتم تشغيل النهج القابل لإعادة التدوير
قائمة جديدة
قبل الحلقة لإجراء التخصيص الأول ، ثم تشغيل
Clearأو إعادة تعيين البيانات لحفظ مساحة الذاكرة والقمامة التي تم إنشاؤها. بعد انتهاء هذه الحلقة ، لن يتبقى سوى قائمة واحدة في الذاكرة ، وهي أصغر بكثير من 10000 منها.

تجميع الكائنات هو في الأساس تنفيذ عام لهذا المفهوم. إنها مجموعة من العناصر التي يمكن إعادة استخدامها. لا توجد واجهة رسمية لأحد ، ولكن بشكل عام لديهم مخزن بيانات داخلي وتنفيذ طريقتين:
GetObject ()
، و
ReleaseObject ()
بدلاً من تخصيص كائن جديد ، يمكنك طلب كائن من تجمع الكائنات. قد ينشئ التجمع كائنًا جديدًا إذا لم يكن متوفرًا به. وبعد ذلك ، عندما تنتهي من ذلك ، تحرر هذا الكائن مرة أخرى إلى حوض السباحة. بدلاً من إلقاء الكائن في القمامة ، يحافظ تجمع الكائنات على تخصيصه ولكنه يمحوه من جميع البيانات. في المرة التالية التي تقوم فيها بتشغيل
GetObject، تقوم بإرجاع الكائن الفارغ الجديد. بالنسبة للكائنات الكبيرة ، مثل القوائم ، يكون القيام بذلك أسهل بكثير على الذاكرة الأساسية.

تحتاج إلى التأكد من تحرير الكائن قبل استخدامه مرة أخرى ، لأن معظم المسابح تحتوي على أقصى عدد من الكائنات الفارغة التي تحتفظ بها في متناول اليد. إذا حاولت الحصول على 1000 عنصر من البركة ، فسوف تقوم بتجفيفها ، وسوف تبدأ في تخصيصها بشكل طبيعي عند الطلب ، مما يتعارض مع الغرض من التجمع.
في حالات الأداء الحرجة ، خاصة عند العمل كثيرًا مع الكثير من البيانات المتكررة ، يمكن أن يؤدي تجميع الكائنات إلى تحسين الأداء بشكل كبير. ومع ذلك ، فهي ليست شاملة ، وهناك الكثير من الأوقات التي لا تريد فيها تجميع العناصر. لا تزال عمليات التخصيص مع
new
سريعة جدًا ، لذا ما لم تكن تخصص أجزاء كبيرة من الذاكرة كثيرًا ، أو تخصص كائنات بأداء عالي الأداء ، فمن الأفضل غالبًا استخدام
جديدًا بدلاً من التجميع غير الضروري ، لا سيما بالنظر إلى أن التجمع نفسه يضيف المزيد من النفقات العامة والتعقيد إلى التخصيص.سيكون تخصيص كائن عادي دائمًا أسرع من تخصيص كائن مجمع واحد ؛ يأتي فرق الأداء عندما تخصص عدة مرات.
ستحتاج أيضًا إلى التأكد من أن تنفيذ التجميع يزيل حالة الكائن بشكل صحيح. إذا لم يكن الأمر كذلك ، فيمكنك المخاطرة بـ
GetObjectإرجاع شيء يحتوي على بيانات قديمة. قد تكون هذه مشكلة كبيرة ، على سبيل المثال ، إذا قمت بإرجاع بيانات مستخدم مختلف عند جلب شخص آخر. بشكل عام ، إنها ليست مشكلة إذا تم إجراؤها بشكل صحيح ، ولكنها شيء يجب مراعاته.
إذا كنت ترغب في استخدام Object Pools ، تقدم Microsoft تطبيقًا في
Microsoft. Extensions. ObjectPool
إذا كنت ترغب في تنفيذه بنفسك ، يمكنك فتح المصدر للتحقق كيف تعمل في
DefaultObjectPoolبشكل عام ، سيكون لديك مجموعة كائنات مختلفة لكل نوع ، مع أقصى عدد من الكائنات للاحتفاظ بها في التجمع.