هل تلقى كائن في VB 2010 نفس الأمثل مثل الديناميكي في C# 4.0؟

StackOverflow https://stackoverflow.com/questions/2628424

سؤال

جادل بعض الناس بأن ميزة C# 4.0 قدمت مع dynamic الكلمة الرئيسية هي نفس ميزة "كل شيء كائن" من VB. ومع ذلك ، سيتم ترجمة أي مكالمة على متغير ديناميكي إلى مندوب مرة واحدة وبعد ذلك ، سيتم استدعاء المندوب. في VB ، عند استخدام Object, ، لا يتم تطبيق أي تخزين مؤقت ، وتتضمن كل مكالمة على طريقة غير مملوءة مجموعة كبيرة من الانعكاس تحت الغرض ، مما يصل أحيانًا إلى عقوبة أداء ضخمة 400 ضعف.

لديك تحسين النوع الديناميكي والتخزين المؤقت تمت إضافته أيضًا إلى مكالمات طريقة VB Untyped ، أو هل ما زال كائن VB غيره بطيئًا جدًا؟

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

المحلول

المحلول

بعض الأبحاث وقراءة أفضل ل تمت الإشارة إليها في وقت سابق إلى المقالة ذكره هانز باسانت ، يجلب الاستنتاج التالي:

  • يدعم VB.NET 2010 DLR ؛
  • يمكنك تنفيذ IDynamicMetaObjectProvider إذا كنت ترغب في دعم ديناميكيات بشكل صريح ، يتم تحديث برنامج التحويل البرمجي VB.NET للتعرف على ذلك ؛
  • VB Object سيستخدم فقط DLR وطريقة التخزين المؤقت إذا كان الكائن ينفذ IDynamicMetaObjectProvider;
  • لا تنفذ أنواع BCL و Framework IDynamicMetaObjectProvider, ، استخدام Object على مثل هذه الأنواع أو الأنواع الخاصة بك ، سوف تستدعي VB.NET المتأخرة الكلاسيكية غير المقيدة.

الخلفية: التفصيل حول سبب تعزيز التذاكر المتأخرة يمكن أن يساعد في أداء رمز VB

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

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

إذا كنت قادرًا على البحث عن الطريقة مرة واحدة ، ثم تخزين مؤشر الطريقة في جدول البحث ، فإن هذا من شأنه أن يسرع هذه العملية بشكل كبير. يتم ربط الطريقة المخزنة مؤقتًا في DLR خطوة واحدة مستقبلاً ويحل محل الطريقة مع مؤشر إلى الطريقة الفعلية ، إن أمكن. بعد المكالمة الأولى ، يصبح هذا ترتيبًا أسرع لكل مكالمة لاحقة (فكر في 200x إلى 800x بشكل أسرع).

كمثال على متى هذا مهم ، إليك بعض التعليمات البرمجية التي توضح هذه المشكلة. في حالة يكون فيها كل فصل .Name خاصية السلسلة ، لكن الفئات لا تشترك في سلف أو واجهة مشتركة ، يمكنك فرز قوائم أي من هذه الأنواع مثل ذلك:

' in the body of some method '
List<Customers> listCustomers = GetListCustomers()
List<Companies> listCompanies = GetListCompanies()

listCustomers.Sort(MySort.SortByName)
listCompanies.Sort(MySort.SortByName)

' sorting function '
Public Shared Function SortByName(Object obj1, Object obj2) As Integer
    ' for clarity, check for equality and for nothingness removed '    
    return String.Compare(obj1.Name, obj2.Name)    
End Function

هذا الرمز (المماثل على الأقل) جعلته بالفعل في الإنتاج مع أحد عملائي وتم استخدامه في رد اتصال Ajax الذي يسمى في كثير من الأحيان. دون التخزين المؤقت يدويًا .Name خصائص ، بالفعل في قوائم متوسطة الحجم تقل عن نصف مليون كائن ، أصبح الرمز المرتبط المتأخر عبئًا ملحوظًا لدرجة أنه خفض الموقع بأكمله في النهاية. ثبت أنه من الصعب تعقب هذه المشكلة ، لكن هذه قصة لفترة أخرى. بعد إصلاح هذا ، استعاد الموقع 95 ٪ من سيارات وحدة المعالجة المركزية.

لذا ، الجواب على سؤال هانز "لا لديك مشاكل أكبر للقلق" بسيط: هذه مشكلة كبيرة (أو يمكن أن تكون) ، esp. لمبرمجي VB الذين أصيبوا بالإهمال بشأن استخدام الربط المتأخر.

في هذه الحالة بالذات ، والكثير من أعجبهم ، يبدو أنه لم تتم ترقية VB.NET 2010 لتقديم الرتب المتأخرة ، وعلى هذا النحو ، Object لا يزال شريرًا على غير مدرك ولا ينبغي مقارنته بـ dynamic.

ملاحظة: من الصعب للغاية تعقب مشكلات الأداء المرتبطة المتأخرة ، إلا إذا كان لديك مجموعة جيدة من الأداء وتعرف على مدى الرتب المتأخرة التي يتم تنفيذها داخليًا من قبل المترجم.

نصائح أخرى

نقلاً عن ما هو المقال الجديد:

تم تحديث Visual Basic 2010 لدعم DLR بالكامل في LateBinder

لا يمكن الحصول على أكثر وضوحا من ذلك. إنه DLR الذي ينفذ التخزين المؤقت.

سؤال جيد. أظن أن الإجابة هي "لا" ، لأن هذه المقالة في مجلة MSDN ، تقول مجلة VB.NET لدعم وقت تشغيل اللغة الديناميكية ، ويصف بإيجاز التغييرات في وقت التشغيل ولكنه لا يذكر التخزين المؤقت.

هل يعرف أحد أفضل؟

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