تتضمن
إصدارات Visual Studio 2019
16.3 و 16.4 تحسينات على C ++ inliner. من بين هذه القدرة على تضمين بعض الإجراءات بعد تحسينها ، والمشار إليها باسم "Zipliner". وفقًا للتطبيق الخاص بك ، قد ترى بعض التحسينات الطفيفة في جودة الكود و / أو تحسينات وقت الإنشاء (المحول البرمجي) الرئيسية.
C2 الداخلية
قدم Terry Mahaffey نظرة عامة
على القرارات المضمنة في Visual Studio . يعرض هذا بالتفصيل بعض القيود ومجالات التحسين الداخلية ، وبعضها ذو صلة بشكل خاص هنا:
- البطانة متكررة وقد تعيد العمل في كثير من الأحيان. تعد القرارات المضمنة حساسة للسياق وليس من المفيد دائمًا إعادة اتخاذ القرارات الخاصة بها لنفس الوظيفة.
- في الداخل هو الميزانية واعية جدا. لديه مهمة صعبة لتحقيق التوازن بين الحجم القابل للتنفيذ مع أداء وقت التشغيل.
- دائمًا ما تكون وجهة نظر inliner للعالم "مُحسَّنة مسبقًا". ولديها معرفة محدودة جدًا بمسار نشر النسخ ومسارات التحكم الميت على سبيل المثال.
الحديث C ++
لسوء الحظ ، تصطدم العديد من أنماط الترميز والتعابير الشائعة في البرمجة العامة الثقيلة بتلك القيود. خذ بعين الاعتبار الروتين التالي في
مكتبة Eigen :
Eigen::Matrix<float,-1,1,0,-1,1>::outerStride(void)
الذي يدعو innerSize:
template<typename Derived> class DenseBase ... Index innerSize() const { return IsVectorAtCompileTime ? this->size() : int(IsRowMajor) ? this->cols() : this->rows(); }
أن إنشاء مثيل لـ OuterStride لا يفعل شيئًا سوى إرجاع أحد أعضائه. لذلك ، هو مرشح ممتاز للتوسع مضمنة بالكامل. لتحقيق هذا الفوز ، على الرغم من ذلك ، يجب على المترجم إجراء تقييم كامل وتوسيع إجمالي callees الـ 18 الخاصة بـ OuterStride ، لكل موقع callStant لـ OuterStride في الوحدة النمطية. هذا يأكل في كل من الإنتاجية محسن وكذلك ميزانية حجم رمز inliner. تجدر الإشارة أيضًا إلى أن الدعوات إلى "الصفوف" و "العقيدات" يتم توسيعها بشكل داخلي أيضًا ، على الرغم من أن تلك الدعوات تسير في طريق مسدود.
سيكون أفضل بكثير إذا قام المُحسّن فقط بتضمين إرجاع العضو المكون من سطرين:
?outerStride@?$Matrix@N$0?0$0?0$0A@$0?0$0?0@Eigen@@QEBA_JXZ PROC ; Eigen::Matrix<double,-1,-1,0,-1,-1>::outerStride, COMDAT mov rax, QWORD PTR [rcx+8] ret 0
مضمنة IR الأمثل
بالنسبة لمجموعة فرعية من الإجراءات الروتينية ، سيقوم المتسع الآن بتوسيع IR المحسّن بالفعل للروتين ، متجاوزًا عملية جلب الأشعة تحت الحمراء ، وإعادة توسيع callees. هذا له غرض مزدوج وهو توسيع المكالمات بشكل أسرع بكثير ، وكذلك السماح للمتنقل بقياس ميزانيته بدقة أكبر.
أولاً ، سيقوم المُحسِّن بتلخيص أن OuterStride هو مرشح لهذا التوسع الأسرع عندما يتم تجميعه في الأصل (تذكر أن c2.dll يحاول ترجمة إجراءات قبل المتصلين بهم). بعد ذلك ، قد يحل inliner محل المكالمات إلى مثيل خارجية OuterStride بوصول الحقل.
المرشحون لهذا التمدد الأسرع الأسطواني عبارة عن وظائف أوراقية بدون أي سكان محليين ، والتي تشير إلى أكثر من حالتين مختلفتين ، عالميتين ، أو ثوابت. في الممارسة العملية هذا يستهدف معظم البسيطون والمستوطنين.
فوائد
هناك العديد من الأمثلة مثل OuterStride في مكتبة Eigen حيث تتسع شجرة الاتصال الكبيرة في تعليمة واحدة أو إثنين فقط. قد تشهد الوحدات التي تستخدم Eigen بكثافة تحسنا كبيرا في الإنتاجية ؛ قمنا بقياس المُحسّن الذي يستغرق وقتًا أقل حتى 25-50٪ لمثل هذه النسخ.
سيمكّن Zipliner الجديد أيضًا المتنقل من قياس ميزانيته بدقة أكبر. يدرك مطورو Eigen منذ فترة طويلة أن MSVC لا يتوافق مع مواصفاتهم (انظر EIGEN_STRONG_INLINE). يجب أن تساعد Zipliner في تخفيف بعض هذه المخاوف ، حيث يعتبر الروتين ziplined الآن مضمّنًا "مجانيًا" تقريبًا.
جرب الميزة
يتم تمكين هذا بشكل افتراضي في Visual Studio 2019 16.3 ، إلى جانب بعض التحسينات في 16.4. الرجاء
تنزيل Visual Studio 2019 وتجربة التحسينات الجديدة. يمكن الوصول إلينا عبر التعليقات أدناه أو عبر البريد الإلكتروني (visualcpp@microsoft.com). إذا واجهت مشاكل في Visual Studio أو MSVC ، أو كان لديك اقتراح بالنسبة لنا ، فيرجى إخبارنا من خلال المساعدة> إرسال الملاحظات> الإبلاغ عن مشكلة / تقديم اقتراح في المنتج ، أو عبر
مجتمع مطوري البرامج . يمكنك أن تجدنا أيضًا على Twitter (
VisualC ).