مصرف محسن تقنيات محددة
عندما يستدعي بعض التعليمات البرمجية إجراءً ما، فمن الممكن إدراج نص الإجراء مباشرة داخل التعليمات البرمجية المستدعية بدلاً من نقل التحكم إليه. يؤدي هذا إلى توفير النفقات العامة المتعلقة باستدعاءات الإجراءات، فضلاً عن توفير فرصة للعديد من التحسينات المختلفة الخاصة بالمعلمات، ولكن يأتي ذلك على حساب المساحة؛ حيث يُكرر نص الإجراء في كل مرة يُستدعى الإجراء بشكل مضمن. بشكل عام، يعد التضمين مفيدًا في التعليمات البرمجية المهمة للأداء والتي تقوم بإجراء عدد كبير من الاستدعاءات للإجراءات الصغيرة. هذا هو تحسين "القفزات الأقل". وتُعد عبارات لغات البرمجة الآمرة أيضًا مثالًا على هذا النوع من التحسين. على الرغم من أنه من الممكن تنفيذ العبارات باستخدام استدعاءات الوظائف، إلا أنه تُنفذ دائمًا تقريبًا باستخدام تضمين التعليمات البرمجية.
في هذا التحسين، تُدمج القفزات الشرطية المتتالية التي تعتمد كليًا أو جزئيًا على نفس الشرط.
على سبيل المثال، if ( c ) { foo ; } if ( c ) { bar ; } إلى if ( c ) { foo ; bar ; }،
if ( c ) { foo ; } if ( ! c ) { bar ; } إلى if ( c ) { foo ; } else { bar ; }.
تحسين المساحة الذي يتعرف على التسلسلات المشتركة من التعليمات البرمجية، وينشئ برامج فرعية ("ماكرو التعليمات البرمجية") تحتوي على التعليمات البرمجية المشتركة، ويستبدل حدوثات تسلسلات التعليمات البرمجية المشتركة باستدعاءات للبرامج الفرعية المقابلة. يُنفذ ذلك بشكل أكثر فعالية باعتباره تحسينًا للكود الآلي، عندما يكون الكود بأكمله موجودًا. أُستخدمت هذه التقنية لأول مرة للحفاظ على المساحة في تيار البايت التفسيري المستخدم في تنفيذ Macro Spitbol على أجهزة الكمبيوتر الصغيرة. من المعروف أن مشكلة تحديد مجموعة مثالية من وحدات الماكرو التي تقلل المساحة المطلوبة لجزء معين من التعليمات البرمجية هي مشكلة NP-complete، ولكن الأساليب الفعّالة تحقق نتائج شبه مثالية.
(على سبيل المثال، عن طريق تعطيل المحاذاة داخل الصفحة)
قم بإعادة ترتيب شجرة التعبير لتقليل الموارد اللازمة لتقييم التعبير.
إذا كان لدينا اختباران يشكلان شرطًا لشيء ما، فيمكننا أولاً التعامل مع الاختبارات الأكثر بساطة (على سبيل المثال، مقارنة متغير بشيء ما) وبعد ذلك فقط مع الاختبارات المعقدة (على سبيل المثال، تلك التي تتطلب استدعاء وظيفة). تكمل هذه التقنية التقييم الكسول، ولكن يمكن استخدامها فقط عندما لا تعتمد الاختبارات على بعضها البعض. إن اختصار الدلالات قد يجعل هذا الأمر صعبًا.
تعمل عملية التحسين بين الإجراءات على البرنامج بأكمله، عبر حدود الإجراءات والملفات. ويعمل بشكل وثيق مع نظرائه داخل الإجراءات، ويُنفذ بالتعاون بين جزء محلي وجزء عالمي. تتضمن عمليات التحسين بين الإجراءات النموذجية تضمين الإجراءات، وإزالة الكود الميت بين الإجراءات، وانتشار الثوابت بين الإجراءات، وإعادة ترتيب الإجراءات. كما هو الحال عادة، يحتاج المترجم إلى إجراء تحليل بين الإجراءات قبل إجراء التحسينات الفعلية. تتضمن التحليلات البينية تحليل الأسماء المستعارة، وتحليل الوصول إلى المصفوفة، وبناء رسم بياني للمكالمات.
يعد تحسين الإجراءات المتبادلة أمرًا شائعًا في المترجمات التجارية الحديثة من SGI وIntel وMicrosoft وSun Microsystems. لفترة طويلة، أُنتقد GCC مفتوح المصدر بسبب افتقاره إلى التحليلات والتحسينات القوية بين الإجراءات، على الرغم من أن هذا يتحسن الآن. هناك أيضًا مُجمِّع مفتوح المصدر آخر يحتوي على بنية أساسية كاملة للتحليل والتحسين وهو Open64.
بسبب الوقت والمساحة الإضافية المطلوبة للتحليل بين الإجراءات، فإن معظم المترجمين لا يقومون به بشكل افتراضي. يتعين على المستخدمين استخدام خيارات المترجم بشكل صريح لإخبار المترجم بتمكين التحليل بين الإجراءات وغيره من التحسينات المكلفة.