سؤال

لقد قمت بتحسين جزء كبير من لغة C++، وإجراء تغييرات صغيرة حتى في الأماكن البعيدة عن النقاط الساخنة يمكن أن يصل إلى الأداء بنسبة تصل إلى 20%.بعد إجراء تحقيق أعمق، تبين (على الأرجح) وجود سجلات مختلفة قليلاً مستخدمة في النقاط الساخنة.يمكنني التحكم في التضمين باستخدام سمة Always_inline، لكن هل يمكنني التحكم في تخصيص التسجيل؟

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

المحلول

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

يمكنك القيام بذلك باستخدام إعلان متغير خاص مثل هذا:

 register int test_integer asm ("EBX");

يعمل مع بنيات أخرى أيضًا، ما عليك سوى استبدال EBX باسم تسجيل مستهدف محدد.

لمزيد من المعلومات حول هذا أقترح عليك إلقاء نظرة على وثائق مجلس التعاون الخليجي:

http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Local-Reg-Vars.html

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

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


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

نصائح أخرى

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

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

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

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