2011-11-02 11 views
7

एक सूचक को केवल उस मान तक पहुंचने से कम धीमा है? मुझे लगता है कि मेरा सवाल यह है कि - डिफरेंस ऑपरेटर कितना तेज़ है?सूचक सूचकांक दक्षता को कितना प्रभावित करता है?

+3

क्या यह गति या स्मृति है जिसके बारे में आप चिंतित हैं? – ruslik

+0

क्या आपका प्रश्न गति या स्मृति के बारे में है? –

+1

सामान्य रूप से जवाब देने के लिए असंभव। एल 1 कैश में हिट करने वाली मेमोरी एक्सेस सैकड़ों (संभवतः हजारों) से अधिक तेज होगी जो वास्तविक रैम तक पहुंचनी होगी। अटकलें मत करो; बेंचमार्क। – Nemo

उत्तर

20

एक सूचक संकेत के माध्यम से एक आधुनिक सीपीयू कैसे काम करता है, इस वजह से बहुत धीमी हो सकती है। लेकिन रनटाइम मेमोरी के साथ इसका कोई लेना-देना नहीं है।

इसके बजाए, गति भविष्यवाणी और कैश से प्रभावित होती है।

पूर्वानुमान आसान नहीं है जब सूचक बदल नहीं गया है या जब यह अनुमानित तरीकों से बदला जाता है (उदाहरण के लिए, लूप में चार द्वारा वृद्धि या कमी)। यह सीपीयू को वास्तविक कोड निष्पादन से पहले अनिवार्य रूप से चलाने की अनुमति देता है, पता लगाएं कि सूचक मूल्य क्या होगा, और उस पते को कैश में लोड करें। भविष्यवाणी असंभव हो जाती है जब सूचक मूल्य एक जटिल अभिव्यक्ति द्वारा बनाया गया है जैसे हैश फ़ंक्शन।

कैश खेल में आता है क्योंकि पॉइंटर स्मृति में इंगित कर सकता है जो कैश में नहीं है और इसे प्राप्त करना होगा। यदि पूर्वानुमान काम करता है तो यह कम हो जाता है लेकिन यदि भविष्यवाणी असंभव है तो सबसे खराब स्थिति में आप का दोहरा प्रभाव हो सकता है: सूचक कैश में नहीं है और पॉइंटर लक्ष्य कैश में नहीं है। उस सबसे बुरे मामले में सीपीयू दो बार रुक जाएगा।

यदि सूचक को फ़ंक्शन पॉइंटर के लिए उपयोग किया जाता है, तो CPU की शाखा पूर्वानुमानकर्ता खेल में आता है। सी ++ आभासी तालिकाओं में, फ़ंक्शन मान सभी स्थिर होते हैं और भविष्यवाणियों के पास यह आसान होता है। सीपीयू के पास कोड चलाने के लिए तैयार होगा और पाइपलाइन में जब अप्रत्यक्ष कूद के माध्यम से निष्पादन होता है। लेकिन, यदि यह एक अप्रत्याशित फ़ंक्शन पॉइंटर है तो प्रदर्शन प्रभाव भारी हो सकता है क्योंकि पाइपलाइन को फ्लश करने की आवश्यकता होगी जो प्रत्येक कूद के साथ 20-40 CPU चक्र को बर्बाद कर दे।

+0

ठीक किया है, इसलिए यदि मेरे पास कुछ घोंसला वाले लूप हैं जो बफर का उपयोग करते हैं (हर बार जब यह बफर का उपयोग करता है तो यह इस एफएनसी में दो बार एक पॉइंटर को संदर्भित करता है), पॉइंटर मान (अनुमानित) अनुमानित हो सकता है? और यह वास्तव में कुल बात नहीं करेगा? – user965369

+2

यदि बफर कैश में फ़िट होने के लिए काफी छोटा है, तो स्मृति एक्सेस बहुत तेज होगी चाहे वे पूर्वानुमानित हों या नहीं। – Nemo

+0

@ user965369: यह सुनिश्चित करने के लिए अपनी पूरी कोशिश करें कि बफर L1 कैश में फिट बैठता है, यदि आप ऐसा नहीं कर सकते हैं, तो कम से कम इसे L2 कैश में फ़िट करें। अधिकतम गति प्रक्रिया के लिए कैश आकार के ब्लॉक में बड़े बफर। –

2

यह एक स्मृति का उपयोग अधिक की आवश्यकता है:

  1. सूचक चर
  2. में संग्रहीत पढ़ पते पर मूल्य

पढ़ यह 2 सरल ऑपरेशन के बराबर नहीं हो सकता है पता पढ़ , क्योंकि कैश में पहले से लोड नहीं किए गए पते तक पहुंचने के कारण इसे और अधिक समय की आवश्यकता हो सकती है।

+0

इसके लिए * मेमोरी एक्सेस * अधिक, जो एक तंग पाश में निषिद्ध हो सकता है। सभी सीपीयू ऑपरेशंस बराबर नहीं बनाए जाते हैं। –

+0

हाँ..तुम सही हो .. मैंने अपना जवाब – Heisenbug

2

ऐसा करता है। यह एक अतिरिक्त लाने की लागत है।
मूल्य द्वारा एक चर को एक्सेस करना, चर सीधे इसकी स्मृति स्थान से पढ़ा जाता है।
पॉइंटर के माध्यम से इसे एक्सेस करने से पॉइंटर से चर के पते को लाने और फिर उस स्मृति स्थान से मान पढ़ने का एक ओवरहेड जोड़ता है।

संभोग, यह मानते हुए कि चर एक रजिस्टर में नहीं रखा गया है, जो कि कुछ परिदृश्यों में तंग loops जैसे होगा। मेरा मानना ​​है कि प्रश्न इस तरह के परिदृश्यों को मानने वाले उपरांत का जवाब मांगता है।

3

की तरह सामान पर निर्भर करता है:

  • कि क्या "सीधे पहुँचा" मूल्य पहले से ही एक रजिस्टर में है, या ढेरों पर
  • (वह भी एक सूचक अविवेक है) लक्ष्य पता पहले से ही कैश में है कि क्या
  • कैश वास्तुकला, बस वास्तुकला आदि

यानी, भी कई चर उपयोगी यह संख्या कम बिना के बारे में अटकलें लगाना।

यदि आप वास्तव में जानना चाहते हैं, तो इसे अपने विशिष्ट हार्डवेयर पर बेंचमार्क करें।

2

मान लीजिए कि आप एक असली सूचक (किसी प्रकार का स्मार्ट पॉइंटर नहीं) से निपट रहे हैं, तो डिफरेंस ऑपरेशन (डेटा) मेमोरी का उपभोग नहीं करता है। यह (संभावित रूप से) एक अतिरिक्त मेमोरी संदर्भ शामिल करता है हालांकि: पॉइंटर द्वारा इंगित डेटा तक पहुंचने के लिए दूसरा पॉइंटर लोड करता है।

यदि आप एक तंग पाश में एक सूचक का उपयोग कर रहे हैं, हालांकि, यह आमतौर पर अवधि के लिए एक रजिस्टर में लोड हो जाएगा। इस मामले में, लागत अधिकतर अतिरिक्त दबाव दबाव के मामले में होती है (यानी, यदि आप उस सूचक को स्टोर करने के लिए एक रजिस्टर का उपयोग करते हैं, तो आप इसे एक ही समय में कुछ और स्टोर करने के लिए उपयोग नहीं कर सकते हैं)। यदि आपके पास एक एल्गोरिदम है जो अन्यथा ठीक रजिस्टरों को भर देगा, लेकिन एक पॉइंटर को अपग्रेड करने के साथ स्मृति में बह जाएगा, इससे कोई फर्क पड़ सकता है। एक समय में, यह एक बहुत बड़ा नुकसान था, लेकिन अधिकांश आधुनिक CPUs (अधिक रजिस्टरों और ऑन-बोर्ड कैश के साथ) जो शायद ही कभी एक बड़ा मुद्दा है। स्पष्ट अपवाद कम रजिस्ट्रार और कोई कैश (और ऑन-चिप मेमोरी के बिना) के साथ एक एम्बेडेड सीपीयू होगा।

नीचे की रेखा यह है कि यह आमतौर पर बहुत नगण्य है, अक्सर थ्रेसहोल्ड के नीचे जहां आप इसे भी माप सकते हैं।

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