2009-05-13 7 views
6

अंगूठे का नियम यह है कि छोटे structs को मूल्य से गुजरना ठीक है और बड़े लोगों को पॉइंटर्स किया जाना चाहिए।मूल्य से कुशलता से कितने बड़े structs पारित किया जा सकता है?

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

मुझे पता है कि प्लेटफ़ॉर्म के बीच यह अलग-अलग होगा, लेकिन मुझे लगता है कि कुछ अनुमानित अनुमान दिए जा सकते हैं। एक या दो साल पहले मैंने इसे पीपीसी आर्किटेक्चर पर समझने की कोशिश की और मुझे आश्चर्य हुआ कि कोई व्यक्ति मूल्य से कुशलतापूर्वक काफी डेटा पास कर सकता है। पीपीसी में बड़ी संख्या में रजिस्टरों की वजह से 10 डबल वैल्यू सोचें या तो ठीक था। पॉइंटर द्वारा वास्तव में स्मृति में और बाहर प्रतिलिपि बनाने में शामिल थे।

हालांकि अब मैं इंटेल पर हूं और मुझे उम्मीद है कि चीजें अलग हो सकती हैं। चूंकि सीपीयू में पारंपरिक रूप से कई रजिस्ट्रार नहीं हैं, लेकिन शायद यह 64 बिट या फ़्लोटिंग पॉइंट रजिस्टरों पर अलग है?

+4

यह निर्भर करता है .... आपको बेंचमार्क की आवश्यकता है ... –

+1

मिच सही है, जानने का एकमात्र तरीका बेंचमार्क है। और आपके द्वारा परीक्षण किए जाने वाले प्लेटफ़ॉर्म के आधार पर आपका उत्तर अलग-अलग होगा। –

+0

मुझे लगता है कि मेरी समस्या यह है कि मुझे नहीं पता कि बेंच को ठीक से कैसे चिह्नित किया जाए। मुझे डर है कि एक सरल उदाहरण संकलक द्वारा बहुत आसानी से अनुकूलित किया जाएगा, और वास्तविक उपयोग को प्रतिबिंबित नहीं करेगा। यह समयपूर्व अनुकूलन करने के लिए बेवकूफ लग सकता है, लेकिन ऐसा कुछ है जिस पर मैंने अच्छा प्रदर्शन करने के लिए संघर्ष किया है, इसलिए मैं अनावश्यक बेवकूफ पसंद नहीं करना चाहता हूं। यह मेरे पूरे एपीआई डिज़ाइन को प्रभावित करेगा, इसलिए मैं बाद में ये सब बदलना नहीं चाहता हूं। –

उत्तर

1

ठीक है, इसलिए मैंने सलाह का पालन करने और पॉइंटर्स और मूल्य का उपयोग करके मेरे कोड को प्रोफाइल करने का प्रयास किया। मैंने असेंबली कोड भी देखा। ऐसा लगता है कि x86 पर प्रदर्शन विशेषताओं पीपीसी से काफी अलग हैं। पीपीसी पर बाइनरी इंटरफेस को सी निर्दिष्ट करता है कि तर्क रजिस्टरों में डाल दिए जाएंगे (वहां से चुनने के लिए बहुत सारे थे), हालांकि ऐसा लगता है कि 64 बिट x86 पर भी स्टैक पर तर्क डालने की आवश्यकता होती है।

तो यह बताता है कि क्यों x86 द्वारा पॉइंटर द्वारा गुज़रने पर हमेशा तेज लगता है। हालांकि मैंने देखा कि कंपाइलर इनलाइन के लिए बहुत उत्सुक है। तो इससे कोई फर्क नहीं पड़ता कि मैंने इसे किस तरह से किया था। तो मुझे लगता है कि निष्कर्ष आपके लिए सुविधाजनक जो भी गुजरना है उसका उपयोग करना है।

मुझे लगता है कि मूल्य मूल्य से गुजरते हैं, क्योंकि मूल्यों की प्रतियों पर काम करना कुछ हद तक सुरक्षित है। मेरा टेस्ट केस 4 युगल से युक्त एक स्ट्रक्चर था (इसलिए मुझे लगता है कि यह अधिकांश प्लेटफार्मों पर 32 बाइट बनाता है)।

4

यदि आप वेब पर खोज करते हैं तो आपको संदर्भ और मूल्य से गुजरने के लिए बाइट आकार के बारे में कुछ दिशानिर्देश मिलेंगे। मैं इस पर बहुत अधिक भरोसा करता हूं। लिए एक ही रास्ता पता है कि एक विशेष struct एक समस्या है है

प्रोफाइल यह

यही एक रास्ता है 100% एक समस्या है पता करने के लिए है।

नायसेयर कूदने से पहले। हाँ वहां कुछ स्पष्ट मामले हैं। उदाहरण के लिए यदि मैं 100 सदस्यों का कहना था तो मैं कभी भी मूल्य से संरचना को पास नहीं करता। लेकिन यह प्रदर्शन के मुद्दों के लिए नहीं होगा, यह अंतरिक्ष की समस्याओं को ढेर करने के लिए और अधिक होगा।

+0

डाउनवोट। यह कोई जवाब नहीं है - लोगों को वेब पर खोजने के लिए न कहें। तथ्यों को पोस्ट करें और उन्हें देखें। –

0

उस परीक्षण को अनदेखा न करें जो आपके परीक्षण में संरेखण करता है। यदि आप फ्लोट्स या डबल्स पास कर रहे हैं और आपकी संरचनाओं को उचित सीमाओं पर गठबंधन नहीं किया गया है, तो प्रोसेसर आपके मूल्य का हिस्सा ले जा सकता है, इसे स्थानांतरित कर सकता है, फिर इसे संग्रहीत करने से पहले बाकी को ऑर्डर कर सकता है। मुझे लगता है कि अधिकांश आधुनिक कंपाइलर्स डीटीआरटी (जब इसे घोषित किया जाता है तो संरचना को संरेखित करके), लेकिन यदि आप अंतरिक्ष के लिए अनुकूलित कर रहे हैं तो यह संभवतः एक मुद्दा होगा।

हममम, अब मैं इसके बारे में लगता है कि, इस को एक अलग नज़रिए के साथ, ले के रूप में मैं के बाद से पेंटियम प्रो 86 मेहराब पर किसी भी निम्न स्तर कोडिंग नहीं किया है ...

0

कुछ compilers हो सकता है आपके लिए इष्टतम आकार निर्धारण करें। अगर मुझे सही याद है, तो TI28xx कंपाइलर स्वचालित रूप से संदर्भ द्वारा पास करने के लिए मूल्य से गुजरता है यदि संरचना एक निश्चित आकार से ऊपर है।

2

सी ++ में पास करने का नियमconst संदर्भ के रूप में निम्न सूची पर नहीं है क्योंकि प्रदर्शन अनिवार्य रूप से कभी भी खराब नहीं होता है। अपवादों की सूची है:

  • प्राथमिक प्रकार (int आदि),
  • संकेत दिए गए,
  • खाली प्रकार (टैग प्रकार),
  • समारोह की तरह प्रकार (functors), और
  • iterators।

मुझे यकीन नहीं है कि इसे सीधे सी पर लागू किया जा सकता है (सी के स्पष्ट प्रकारों के अलावा) लेकिन शायद एक समान दिशानिर्देश लागू होता है।

+0

मैं सी ++ प्रोग्रामिंग करते समय इस पैटर्न का पालन करता हूं, लेकिन कड़ाई से बोल रहा हूं कि मुझे यकीन नहीं है कि हमेशा इष्टतम होता है। जहां तक ​​मुझे पता है कि MyClass & var, कॉन्स्ट पॉइंटर के रूप में लागू किया गया है। और छोटी वस्तुओं के लिए (उदाहरण के लिए 2-3 युगल कहें) पॉइंटर द्वारा पास मूल्य से गुजरने से धीमा है। –

+0

पाठ्यक्रम के पॉइंटर्स तक पहुंच एक ओवरहेड बनाती है लेकिन प्रोसेसर निर्माता पॉइंटर्स की आवश्यकता से अवगत हैं। ऐसे में, वे सावधानी बरतते हैं। उदाहरण के लिए एएमडी ऑप्टिमाइज़ेशन गाइड स्पष्टीकरण यहां पॉइंटर्स का उपयोग करने की सलाह देता है क्योंकि प्रोसेसर इस तरह के उपयोग के साथ दिमाग में विकसित होता है। लंबी कहानी छोटी: यहां तक ​​कि छोटे structs के लिए, पॉइंटर्स पास-दर-मूल्य से तेज़ हो सकते हैं। इनलाइनिंग निश्चित रूप से इस व्यवहार को और संशोधित कर सकती है। –

+0

क्या आपके द्वारा पोस्ट की गई अपवाद सूची का कोई "आधिकारिक" स्रोत है? मैं एक प्रश्न लिखने के लिए तैयार था मौसम के संदर्भ में प्राथमिक प्रकारों को पारित करने के लिए यह समझ में आता है। –

-1

आमतौर पर आदिम प्रकार मैं मूल्य से गुजरता हूं, संदर्भ के अनुसार अन्य सभी। यह अंगूठे का मेरा नियम है।

+4

प्रश्न आपके नियमों के बारे में नहीं, प्रदर्शन के बारे में है। – stepancheg

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

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