سؤال

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

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

O] غالبًا ما يكون التجويف أسهل عند القيام به في وقت التشغيل بواسطة جهاز افتراضي ذكي - -.

لماذا يكون التحسين أسهل عند إجرائه في وقت التشغيل بواسطة جهاز افتراضي مقارنةً بوقت الترجمة؟

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

المحلول

اجابة قصيرة: لأنه من الأسهل تحديد النقاط الفعالة وتحليلها في وقت التشغيل - وهي أجزاء برنامجك التي تستهلك معظم الوقت.

اجابة طويلة:

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

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

نقطة أخرى هي أنه في وقت التشغيل يمكنك وضع افتراضات، والتي تكون مستحيلة في وقت الترجمة.على سبيل المثال، يتم تضمين Java-VM في الأساليب الافتراضية لوضع الخادم - طالما تم تحميل فئة واحدة فقط، والتي تنفذ هذه الطريقة.سيكون ذلك غير آمن، إذا تم القيام به في وقت الترجمة.يقوم JVM بإلغاء تحسين الكود مرة أخرى، إذا تم تحميل فئة أخرى، ولكن هذا لا يحدث غالبًا.

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

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

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

نصائح أخرى

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

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

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

تتيح لك هذه الأشياء إجراء تحسينات في وقت التشغيل لا يمكنك إجراؤها في وقت الترجمة.

يمكن لـ VM جمع الإحصائيات لتحسينها، كما تفعل قاعدة البيانات بشأن استخدامك.

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

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

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

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