سؤال

في C ++، يمكنني إعلان طريقة "مضمنة" ومن المحتمل أن يغلقه المحول البرمجي. بقدر ما أفهم أنه لا توجد كلمات رئيسية مثل Java.

يتم الانضمام إذا قرر JVM القيام بذلك؟ هل يمكنني التأثير على هذا القرار بطريقة أو بأخرى؟

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

المحلول

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

دع JVM تدع JVM القيام به - من المحتمل أن تكون أفضل بكثير في العمل من أين تتلاشى مما أنت عليه.

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

نصائح أخرى

على الرغم من أن مترجم Java يمكن أن يقوم بما في ذلك (للطرق القصيرة المحددة المبكرة) حقيقة سوف يتم الانضمام بواسطة مترجم JIT. سوف يكون مترجم JIT (Hotspot) قادرا على مضمنة افتراضية طرق. أفضل طريقة للتفاعل معها هي كتابة رمز بسيط وموجز. على الأرجح، لن يسمح الكود الذي يستخدم الانعكاس بالتسخين.

امل ان يساعد.

"في C ++، يمكنني أن أعلن طريقة" مضمنة "وسيقوم البرمجة بمفناها"... أم لا. المحول البرمجي مجاني في جعل الوظيفة مضمنة أم لا ولا يمكنك التأثير حقا على النتيجة. إنه مجرد تلميح إلى المحول البرمجي.

في Java، لا يوجد شيء من هذا القبيل، يمكن للمترجم (وأحدث VM أثناء إجراء التحسينات) أن تقرر "مضمنة" الطريقة.

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

الأرجح من المرجح أن يحدث إذا كانت الطريقة المعنية هي:

  • قصيرة
  • أخير
  • لا تعتمد على أي طرق طويلة غير نهائية

لأن هذه هي الظروف الوحيدة التي يمكن أن تكون فيها JVM متأكدا من آثار المكالمة.

class A {
    final int foo() { return 3; }
}

بالنظر إلى هذه الفئة، يمكن استبدال أي مكالمة إلى FOO () بالثابت "3". أي آلة افتراضية Java1 يمكن أن تفعل هذا، لأن أخير تملي الكلمة الرئيسية صراحة أنه من غير الممكن الحصول على فرعية تتجاوز "int foo ()".

يوفر Inlining الطريقة الفوائد التالية في موقع الاتصال:

  • لا طريقة الاتصال
  • لا إرسال ديناميكي
  • ممكن للقيمة الثابتة، على سبيل المثال. يصبح "a.foo () + 2" 5 مع عدم تنفيذ رمز
    مدة العرض.

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

JVM الحديثة، مثل Java Hotspot VM قادر على مضمون الفصل بدون أخير. وبعد الكلمة الرئيسية **.

(http://java.sun.com/developer/technicalarticles/networking/hotspot/inlining.html)

اقرأ هذا من أجل السلوك الداخلي.http://www.javacoffeeaknam.com/articles/thinkinginjava/comparingcc ++andjava.html.

تقول أن الأساليب النهائية يمكن أن تطل على ولكن ليس دائما.

نعم، إذا قرر JVM القيام بذلك، فيمكنه. تتضمن طرق التأثير وضع الطريقة ثابتة أو نهائية.

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

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

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

ملاحظة: استخدمت مربع خوارزمية الصندوق لتقييم الأداء.

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