سؤال

قرأت مؤخرا مناقشة بشأن ما إذا تمكنت لغات هي أبطأ (أو أسرع) من اللغات الأصلية (على وجه التحديد C# vs C++).الشخص الذي ساهم في النقاش: قال JIT القائمون على إدارة اللغات سيكون قادرا على إجراء تحسينات فيما يتعلق المراجع التي ببساطة غير ممكن في اللغات التي تستخدم المؤشرات.

ما أود أن أعرف ما هو نوع من التحسينات الممكنة على المراجع وليس على المؤشرات ؟

علما أن النقاش كان حول سرعة التنفيذ ، عدم استخدام الذاكرة.

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

المحلول

هناك بعض الفوائد من جيت تجميع ذكر في ويكيبيديا:

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

  1. تجميع يمكن أن يكون الأمثل المستهدفة CPU ونظام التشغيل نموذج حيث يتم تشغيل التطبيق.على سبيل المثال JIT يمكن اختيار SSE2 تعليمات وحدة المعالجة المركزية عندما يكتشف أن تدعم وحدة المعالجة المركزية لهم.مع ثابت المترجم يجب كتابة نسختين من القانون ، ربما باستخدام مضمنة الجمعية.
  2. النظام قادر على جمع إحصاءات عن كيفية البرنامج هو في الواقع يعمل في البيئة ، ويمكن إعادة ترتيب و إعادة ترجمة للحصول على الأداء الأمثل.إلا أن بعض ساكنة المجمعين يمكن أيضا أن تأخذ المعلومات الشخصية كمدخل.
  3. النظام يمكن أن تفعل العالمية تحسينات رمز (على سبيل المثالتضمين المكتبة) دون أن تفقد مزايا ديناميكية تربط دون النفقات العامة الملازمة ثابتة المجمعين و linkers.وتحديدا عند القيام العالمية مضمنة التبديلات ، ثابت المترجم يجب إدراج وقت التشغيل وضمان أن الاتصال الافتراضية يمكن أن يحدث إذا الفعلية فئة الكائن يتجاوز inlined الأسلوب.
  4. على الرغم من أن هذا ممكن مع ثابت تجميع القمامة التي تم جمعها اللغات ، بايت كود النظام يمكن بسهولة إعادة ترتيب الذاكرة من أجل تحسين استخدام ذاكرة التخزين المؤقت.

لا أستطيع التفكير في شيء ذات الصلة مباشرة إلى استخدام الإشارات بدلا من المؤشرات.

نصائح أخرى

في C++ هناك نوعان من المزايا من المراجع ذات الصلة إلى تحسين جوانب:

  1. مرجع ثابت (يشير إلى نفسه متغير لها العمر كله)

    لأن هذا يسهل على المترجم أن نستنتج الأسماء التي تشير إلى نفس المتغيرات الأساسية - وبالتالي خلق فرص التحسين.ليس هناك ما يضمن أن المجمع سوف نفعل ما هو أفضل مع المراجع, ولكن قد...

  2. إشارة يفترض أن أشير إلى شيء (لا يوجد مرجع فارغة)

    مرجعا ذلك "يشير إلى لا شيء" (أي ما يعادل مؤشر فارغة) يمكن أن تنشأ ، ولكن هذا ليس من السهل كما خلق مؤشر فارغة.بسبب هذا الاختيار من مرجعية NULL يمكن حذفها.

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

في الكلام العام والمراجع تجعل من الممكن للإشارة إلى نفس الكائن من أماكن مختلفة.

وA 'مؤشر' هو اسم آلية لتنفيذ المراجع. C ++، باسكال، C ... والمؤشرات، C ++ تقدم آلية أخرى (مع حالات الاستخدام الأخرى قليلا) يسمى "المرجعي"، ولكن أساسا هذه كلها تطبيقات لمفهوم المراجع العام.

وحتى لا يكون هناك أي سبب المراجع هي بحكم التعريف أسرع / أبطأ من المؤشرات.

والفرق الحقيقي هو في استخدام JIT أو "في خط الهجوم" مترجم الكلاسيكي: وJIT يمكن أن تأخذ في الاعتبار البيانات التي لا تتوفر لمترجم في خط الهجوم. عليها أن تفعل مع تنفيذ مفهوم "مرجعية" لا شيء.

وإجابات أخرى هي الصحيحة.

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

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

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

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

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