سؤال

أنا أتساءل عما إذا كان الملاكمة نوع القيمة في كائن هو حالة خاصة أو ما إذا كان "المربع" الذي تم إنشاؤه بواسطة .NET يصبح القمامة (أن GC يجب أن تجمع) بعد أي مراجع يتم إسقاطها.

على سبيل المثال، StringBuilder.AppendFormat () لديه هذه الزائدة:

StringBuilder.AppendFormat(string format, object arg0);
StringBuilder.AppendFormat(string format, object arg0, object arg1);
StringBuilder.AppendFormat(string format, object arg0, object arg1, object arg2);
StringBuilder.AppendFormat(string format, params object[] args);

قد تشير هذه الحمل الزائد الإضافي للمكالمات مع 3 أو عدد أقل من الحجج إلى أن الملاكمة بالفعل هي حالة خاصة (أو أنها تؤتي ثمارها، من نقطة عرض الأداء، لتجنب بناء الصفيف).

من الناحية النظرية، باستخدام العد المرجعي القديم العادي، ربما مع مجموعة من الصناديق القابلة لإعادة الاستخدام سيكون تطبيق صالح لأنه لا يمكن أن يكون هناك مراجع من مربع واحد إلى آخر، فقط من كائنات .NET إلى مربع.

هل كانت مفيدة؟

المحلول

أولا، فقط للتوضيح: إنشاء مجموعة من مراجع الكائنات ليس ملاكمة. "الملاكمة" هو مصطلح مع معنى محدد للغاية في .NET، وأعتقد أنه يستحق التمسك به.

ملاكمة هل قم بإنشاء القمامة - أو بالأحرى، في كل مرة تقوم فيها المربع، بإنشاء كائن جديد من المحتمل أن يصبح في نهاية المطاف للقمامة. (لا يملك لتصبح القمامة - قد يكون لديك إشارة إلى هذا الكائن لبقية عمر التطبيق؛ انها مجرد نادرة جدا.)

ولكن هل استطاع لديك ذاكرة التخزين المؤقت لأغراض الملاكمة. في الواقع، جافا يفعل لأعداد صغيرة. إذا كتبت:

Integer x = 5;
Integer y = 5;
System.out.println(x == y); // Reference comparison

ثم هذا مضمون للطباعة true.

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

.صافي استطاع اتخذت نفس النهج مثل جافا ومحاذاة بعض قيم بعض أنواع، لكنني لست متأكدا من أنه يستحق الأمتعة المفاهيمية الإضافية - خاصة عندما تدعم النظام الأساسي أنواع القيمة المخصصة (أي جافا لا).

ربما تجدر الإشارة إلى أنه منذ .NET 2.0، الملاكمة ناد إلى حد ما مما كانت عليه. يحدث ذلك مبلغا عاديا في ملزم البيانات والتفكير، لكنه أقل شيوعا في معالجة البيانات القديمة العادية الآن.

نصائح أخرى

يصبح نوع القيمة المربعة عبارة عن كائن على كومة الكومة، ومثل أي كائن آخر يجب أن يكون (وسيل) يتم جمعها بمجرد الإشارة إليها.

إنشاء طريقة الزائدة مع 3 حجج أو أقل هي (كما تلاحظ) لتجنب بناء الصفيف، وهو تحسين الأداء. انظر "النظر في توفير الحملات الزائدة والإرشادات الخاصة بالمكالمات مع عدد قليل من الحجج في واجهات برمجة التطبيقات الحساسة للغاية للأداء" الأعضاء مع عدد متغير من المعلمات.

ومع ذلك، فإن إنشاء صفيف يختلف بشكل أساسي عن الملاكمة نوع القيمة. استدعاء أي الحمل الزائد من StringBuilder.AppendFormat سوف تحتاج دائما الحجج التي هي أنواع القيمة، لأن المعلمة كتبت كما object, ، سواء تم إنشاء صفيف أم لا. للحصول على شرح مفصل للملاكمة، راجع "الملاكمة والعلوك" في .NET: اكتب الأساسيات.

أنت تسأل السؤال الخطأ.

الحمل الزائد الذي تشير إليه هو تحسين دعوة المعلمة المباشرة. بمعنى أن المحول البرمجي سيضع المتغيرات في Arg_0، Arg_1، Arg_2، Arg_3، فمن الممكن أن يكون لديك أكثر من ذلك، ولكن IL لديه هذه فقط كوصول سريع. يمر الباقي عبر المكدس على أي حال، وبالتالي فهو ليس أكثر فعالية من مكالمة الدالة المكتوبة بالمعلمة.

للحصول على مكالمة الدالة المكتوبة بالمعلمة، فإنها تقوم بالفعل بمجموعة خلف السخرية وإرسالها إلى الوظيفة ك Arg_1 (في هذه الحالة، حيث يتم تناول ARG_0 بواسطة السلسلة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top