البرمجة

تحسين أداء ASP.NET Core: فهم الفارق بين تعداد Dictionary واستخدام Values

عند فحص الشيفرة المصدرية لـ ASP.NET Core على GitHub والتعمق في محتواها، اكتشفت تفاصيل مثيرة للاهتمام في تنفيذ الفريق المسؤول عن ASP.NET. تحديداً في شيفرة مصدر ServiceProvider، في تنفيذ Dispose، تم العثور على تكنيك أثار فضولي. في الشيفرة الخاصة بـ Dispose، يتم تعداد القاموس، وتم وضع تعليق لشرح حيلة في الأداء:

csharp
private readonly Dictionaryobject> _resolvedServices = new Dictionaryobject>(); // Code removed for brevity public void Dispose() { // Code removed for brevity // PERF: We've enumerating the dictionary so that we don't allocate to enumerate. // .Values allocates a KeyCollection on the heap, enumerating the dictionary allocates // a struct enumerator foreach (var entry in _resolvedServices) { (entry.Value as IDisposable)?.Dispose(); } _resolvedServices.Clear(); }

الاستفسار هنا يتمحور حول الفارق بين تعداد القاموس بهذه الطريقة وباستخدام Values. هل لديها تأثير على الأداء؟ أم أنها لأن استخدام ValueCollection سيستهلك المزيد من الذاكرة؟

للإجابة على هذا السؤال، يعود الأمر إلى كيفية تعامل C# مع هذه الهياكل. عند استخدام Values، يتم تخصيص KeyCollection في الذاكرة، بينما تعداد القاموس يخصص مُعينًا هيكلًا تحكميًا (struct enumerator) في الذاكرة. الفريق الذي قام بكتابة الشيفرة اختار تعداد القاموس لتجنب تكلفة تخصيص إضافية على الكومة.

في حالة استخدام Values، يمكن أن يكون له تأثير على الأداء نظرًا للتخصيص الإضافي لهيكل البيانات (ValueCollection) على الكومة، بينما تعداد القاموس يتجنب هذا الأمر بشكل فعّال. وهذا يعني أن استخدام Values قد يؤدي إلى تكاليف إضافية في استهلاك الذاكرة.

بشكل عام، يظهر أن تعداد القاموس مفضل في هذا السياق لتحقيق أداء أفضل دون إضافة أعباء تكلفة الذاكرة.

المزيد من المعلومات

هذه الخطوة البارعة التي اتخذها فريق ASP.NET Core في تنفيذ الـ Dispose لـ ServiceProvider ليست مجرد تفاصيل فنية، بل تكشف عن رؤية متقدمة في تصميم الأداء وتحسينه. دعونا نلقي نظرة أعمق على بعض الجوانب الفنية والاستراتيجية لهذا القرار.

أولًا وقبل كل شيء، يجب فهم أن تعداد القاموس (foreach على القاموس نفسه) يستفيد من هيكل تحكمي (struct enumerator) وهو تحكم في الذاكرة بشكل أكبر من الـ Values. بينما Values تعيد مجموعة من قيم القاموس كـ ValueCollection، وهي هيكل بيانات يتم تخزينه في الكومة، مما يمكن أن يؤدي إلى تكاليف إضافية للإدارة.

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

ثالثًا، الكود المصدر يشير إلى أداء “تعداد القاموس” كحل أمثل بالنسبة للسيناريو المعين لـ ServiceProvider، مما يظهر أن الفريق قد قام بتقييم دقيق لمتطلبات الأداء واختار السيناريو الأمثل.

ببساطة، هذا الاقتباس البرمجي يبرز مستوى التفاهم العالي لفريق ASP.NET Core لتحسين الأداء والحس الرفيع في اختيار الحلول الأمثل. يعكس هذا التوجيه الاهتمام بتحقيق أداء ممتاز وفعالية في استهلاك الموارد، مما يجعل هذا النهج ليس فقط تقنيًا ولكن أيضًا استراتيجيًا في بناء إطار عمل ASP.NET Core.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!