سؤال

هل اتفاقية الدعوة FastCall أسرع حقًا من اتفاقيات الاتصال الأخرى ، مثل CDECL؟ هل هناك أي معايير تُظهر كيف يتأثر الأداء بالاتصال بالاتفاقية؟

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

المحلول

ذلك يعتمد على المنصة. بالنسبة إلى Xenon PowerPC ، على سبيل المثال ، يمكن أن يكون ترتيبًا من الفرق في الحجم بسبب مشكلة في متجر الحمل مع تمرير البيانات على المكدس. لقد قمت بتوقيت النفقات العامة تجريبياً cdecl الوظيفة في حوالي 45 دورة مقارنة بـ ~ 4 ل fastcall.

بالنسبة إلى X86 خارج الترتيب (Intel و AMD) ، قد يكون التأثير أقل بكثير ، لأن جميع السجلات مظللة وإعادة تسميتها على أي حال.

الجواب هو حقًا أنك تحتاج إلى قياسها بنفسك على المنصة المعينة التي تهتم بها.

نصائح أخرى

هل اتفاقية الدعوة FastCall أسرع حقًا من اتفاقيات الاتصال الأخرى ، مثل CDECL؟

أعتقد أن تنفيذ microsofts fastcall في X86 و X64 يتضمن تمرير المعلمتين الأوليين في السجلات بدلاً من على المكدس.

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

اتفاقية الاتصال (على الأقل على x86) لا تحدث فرقًا كبيرًا في السرعة. في Windows ، _stdcall تم إجراؤه الافتراضي لأنه ينتج نتائج ملموسة للبرامج غير التافهة لأنه عادة ما يؤدي إلى حجم رمز أصغر عند مقارنته _cdecl. _fastcall ليست القيمة الافتراضية لأن الفرق الذي يحدثه أقل ملموسًا. ما تعوضه في الحجة التي تمر عبر السجلات التي تخسرها في أجسام الوظائف الأقل كفاءة (كما ذكرنا سابقًا من قبل Anon.). لا تكسب أي شيء عن طريق تمرير السجلات إذا كانت الوظيفة المدعومة على الفور تحتاج إلى تسرب كل شيء في الذاكرة لحساباتها الخاصة.

ومع ذلك ، يمكننا أن ننشرف الأفكار النظرية طوال اليوم - حدد رمزك للإجابة الصحيحة. _fastcall سيكون أسرع في بعض الحالات ، وأبطأ في حالات أخرى.

على الحديثة x86 - لا. بين ذاكرة التخزين المؤقت L1 و ININING ، لا يوجد مكان لـ FastCall.

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