c++ - क्या Fastcall वास्तव में तेज है?




performance calling-convention (3)

क्या Fastcall कॉलिंग कन्वेंशन वास्तव में अन्य कॉलिंग कन्वेंशनों की तुलना में अधिक तेज़ है, जैसे कि cdecl? क्या कोई बेंचमार्क है जो दर्शाता है कि सम्मेलन को बुलाए जाने से प्रदर्शन कैसे प्रभावित होता है?


क्या Fastcall कॉलिंग कन्वेंशन वास्तव में अन्य कॉलिंग कन्वेंशनों की तुलना में अधिक तेज़ है, जैसे कि cdecl?

मेरा मानना ​​है कि x86 और x64 पर fastcall माइक्रोसॉफ़्ट कार्यान्वयन में स्टैक के बजाय रजिस्टरों में पहले दो मापदंडों को पारित करना शामिल है।

चूंकि यह आम तौर पर कम से कम चार मेमोरी एक्सेस को बचाता है, हां यह आम तौर पर तेज है। हालाँकि, यदि इसमें शामिल फ़ंक्शन रजिस्टर-स्टैवर्ड है और इस प्रकार उन्हें स्टैक पर स्थानीय लोगों के लिए लिखने की संभावना है, तो उल्लेखनीय वृद्धि होने की संभावना नहीं है।


अधिवेशन बुलाना (कम से कम x86 पर) वास्तव में गति में बहुत अंतर नहीं करता है। विंडोज में, _stdcall को डिफ़ॉल्ट बनाया गया था क्योंकि यह nontrivial प्रोग्रामों के लिए ठोस परिणाम पैदा करता है, क्योंकि यह आमतौर पर _cdecl साथ तुलना में छोटे कोड आकार में होता है। _fastcall डिफ़ॉल्ट मान नहीं है क्योंकि यह जो अंतर करता है वह बहुत कम मूर्त है। आप कम कुशल कार्य निकायों में खो जाने वाले रजिस्टरों से गुजरने वाले तर्क के लिए क्या बनाते हैं (जैसा कि पहले Anon द्वारा उल्लेख किया गया है।)। आप रजिस्टरों में पास होने से कुछ भी हासिल नहीं करते हैं, अगर कॉल किए गए फ़ंक्शन को तुरंत अपनी गणना के लिए सब कुछ मेमोरी में फैलाने की आवश्यकता होती है।

हालाँकि, हम दिन भर सैद्धांतिक विचारों को सही जवाब के लिए अपने कोड को बेंचमार्क कर सकते हैं। _fastcall कुछ मामलों में तेज होगा, और दूसरों में धीमा होगा।


यह प्लेटफॉर्म पर निर्भर करता है। एक क्सीनन पावरपीसी के लिए, उदाहरण के लिए, यह स्टैक पर डेटा पास करने के साथ लोड-हिट-स्टोर इश्यू के कारण परिमाण अंतर का आदेश हो सकता है। मैं आमतौर पर एक cdecl लिए ~ 4 की तुलना में लगभग 45 चक्रों में एक cdecl फ़ंक्शन के ओवरहेड को समयबद्ध करता हूं।

एक आउट-ऑफ-ऑर्डर x86 (इंटेल और एएमडी) के लिए, प्रभाव बहुत कम हो सकता है, क्योंकि रजिस्टरों को वैसे भी छायांकित और बदला जाता है।

जवाब वास्तव में यह है कि आपको उस विशेष मंच पर खुद को बेंचमार्क करने की आवश्यकता है जिसकी आप परवाह करते हैं।





fastcall