تحسينات الأداء تنتقل من g++/gcc 3.2.3 إلى 4.2.4

StackOverflow https://stackoverflow.com/questions/119887

  •  02-07-2019
  •  | 
  •  

سؤال

لقد كنا نبحث في إصدارات g++ 3.2.3 و4.2.4.مع الإصدار 4.2.4، أصبحت تحسينات الأداء في بعض قواعد الأكواد الخاصة بنا أمرًا هامًا.

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

هل التحسينات هي نتيجة العديد من التغييرات الصغيرة التي كان لها تأثير ببطء؟أو هل كان هناك أفضل 5 مجموعة من التحسينات التي ربما أحدثت فرقًا؟

بالنسبة لبعض المعلومات الأساسية، تستفيد قاعدة التعليمات البرمجية الخاصة بنا بشكل جيد من حاويات STL والخوارزميات، بالإضافة إلى ميزات C++ مثل الكلمة الأساسية "المضمنة".

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

المحلول

في تجربتي، 3.4 هو المكان الذي بلغ فيه الأداء ذروته بشكل أساسي؛4.2 هو في الواقع أبطأ من 3.4 في مشروعي، حيث أن 4.3 هو الأول الذي يساوي تقريبًا أداء 3.4.4.4 أسرع قليلاً من 3.4.

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

أنا شخصيا أستخدم الإصدار 3.4 لأنه يجمع بشكل أسرع بكثير، مما يجعل الاختبار أسرع بكثير.أحاول أيضًا تجنب الإصدارات الأحدث لأنه يبدو أن لديها عادات سيئة تتمثل في سوء ترجمة التعليمات البرمجية؛- يتسبب --march core2 في إصدارات دول مجلس التعاون الخليجي الأخيرة في حدوث أخطاء segfaults في برنامجي، على سبيل المثال، لأنه يصدر كودًا متجهًا تلقائيًا يحاول إجراء عمليات وصول محاذاة على العناوين غير المحاذاة.

بشكل عام، على الرغم من أن الاختلافات نادرًا ما تكون كبيرة؛3-5% نسبة مطلقة معظم لقد رأيت من حيث تغيير الأداء.

الآن، لاحظ أن هذا هو C؛قد تكون الأمور مختلفة في C++.

نصائح أخرى

أعتقد أنه تمت إعادة صياغة المُحسِّن بالكامل في سلسلة gcc4.انظر هذه الصفحة، على سبيل المثال، حول التوجيه:

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

للحصول على معلومات، قمت ذات مرة بإجراء اختبار مرجعي لـ c[i] = a[i] + b[i] باستخدام المصفوفات الديناميكية والمصفوفات الثابتة وstd::vector وكان std::vector هو الأسرع (w/ gcc 4.1).30% فرق في الأداء.

كانت التدفقات بطيئة جدًا في 3.3 وأصبحت أسرع بكثير في 3.4.(رسالة على القائمة البريدية لدول مجلس التعاون الخليجي) أراهن أن أشياء أخرى تحسنت أيضًا.

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