2010-02-02 10 views
38

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

+5

"सम्मेलन बुलाकर प्रदर्शन कैसे प्रभावित होता है?" मामूली रूप से। – avakar

+12

जब यह बड़े पैमाने पर प्रभावित होता है। – Crashworks

+1

यह भी देखें http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish

उत्तर

30

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

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

उत्तर वास्तव में यह है कि आपको अपने पसंदीदा प्लेटफ़ॉर्म पर इसे स्वयं बेंचमार्क करने की आवश्यकता है।

16

क्या फास्टकॉल कॉलिंग कन्वेंशन जैसे अन्य कॉलिंग सम्मेलनों की तुलना में वास्तव में तेजी से कॉलिंग है?

मेरा मानना ​​है कि 86 और 64 पर fastcall के माइक्रोसॉफ्ट के कार्यान्वयन रजिस्टरों में के बजाय ढेर पर पहले दो पैरामीटर प्रदान करने के शामिल है कि।

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

+4

x64 में केवल एक कॉलिंग सम्मेलन है –

10

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

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

8

आधुनिक x86 पर - नहीं। एल 1 कैश और इन-लाइनिंग के बीच फास्टकॉल के लिए कोई जगह नहीं है।

+10

यदि कोई फ़ंक्शन इनलाइन है तो यह न तो है fastcall और न ही cdecl और न ही किसी अन्य कॉलिंग सम्मेलन। – Crashworks

+7

बिल्कुल। एल 1 से प्राप्त करना रजिस्टर पर 1 चक्र है - ज्यादातर मामलों में यह शोर स्तर से नीचे है, इसे विश्वसनीय रूप से बेंचमार्क करना भी मुश्किल है। और ऐसे कार्यों जहां कॉल पर कुछ चक्र महत्वपूर्ण अंतर हैं, वैसे भी रेखांकित किया जाना चाहिए। – ima

+1

मुझे इसके साथ सहमत होना है - किसी भी फ़ंक्शन जो फास्टकॉल से लाभ लेने के लिए पर्याप्त सरल है, उसे और भी इनलाइन करने से लाभ होगा। –

संबंधित मुद्दे