2009-06-16 8 views
8

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

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

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

उत्तर

0

यदि मैं आपकी स्थिति को सही ढंग से समझ रहा हूं (और अगर मुझे नहीं तो सही करें), तो यह छः में से एक या आधा दर्जन है।

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

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

किसी भी दर पर, आप आप की तुलना में अपने आवेदन की एल्गोरिथम जटिलता का अध्ययन कर के बाहर एक बहुत अधिक प्रदर्शन प्राप्त होगा कभी एक वर्ग परिभाषा में दो चरों सूक्ष्म अनुकूलन के साथ होगा। यह भी एक अच्छा विचार है कि एक प्रोफ़ाइल उपकरण का उपयोग करना (उद्देश्य से) जहां आपकी बाधाएं हैं (gprof * nix सिस्टम पर आम है)। क्या कोई विशिष्ट कारण है कि आप विशेष रूप से इलाके कैशिंग को बढ़ाने की सोच रहे हैं?

+0

'क्यों' वास्तव में यहां मुद्दा नहीं है - प्रश्न कैश इलाके बेंचमार्क के लिए स्पष्ट रूप से स्पष्ट है। मुझे नहीं लगता कि 'क्यों' वास्तव में चर्चा में कुछ भी जोड़ता है, और यह मानने के लिए सबसे अच्छा है कि यूसुफ जानता है कि वह क्या कर रहा है। – Justicle

+0

कम से कम IMHO "क्यों" हमेशा महत्वपूर्ण है। "मैं उम्मीद करता हूं कि वास्तविक जीवन स्थितियों में प्रदर्शन में सुधार होना चाहिए" जो मुझे बताता है कि यूसुफ चीजों को गति देने की तलाश में है। "मैं अभी तक अपने असली ऐप में यह कोशिश नहीं करना चाहता हूं" जो इससे भी ज्यादा सुझाव देता है कि उसका अंतिम लक्ष्य बेहतर प्रदर्शन है, और वह बेहतर इलाके के माध्यम से इसके बारे में जाने की कोशिश कर रहा है - यही कारण है कि मैंने बेहतर प्रदर्शन के लिए अन्य पाठ्यक्रमों की सिफारिश की। हालांकि, @ जोसेफ, अगर मैं यहां गलत दिशा में गया, तो कृपया उपेक्षा करें। ;-) [और उस स्थिति में, कैशग्रींड वह है जो आप चाहते हैं] –

+0

मैं एक स्मार्ट पॉइंटर क्लास लिख रहा हूं जो मूल रूप से एल्गोरिदम-कम है। मैंने इसे जी-प्रोफेसर के साथ उस बिंदु तक अनुकूलित किया है जहां ऐसी चीजें हैं जैसे शाखा मौजूद है (एक अगर) या एक नकली पूर्णांक असाइनमेंट यह निर्धारित कर सकता है कि मेरी कक्षा पुराने कार्यान्वयन को धड़कता है या नहीं। यह उन कुछ मामलों में से एक है जहां सूक्ष्म अनुकूलन निश्चित रूप से लागू होते हैं;) –

8

यदि आप लिनक्स पर हैं, तो Cachegrind का उपयोग KCacheGrind के साथ संयोजन के रूप में अधिक जानकारी प्रदान कर सकता है कि आपका कैश कैसा व्यवहार कर रहा है।

2

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

इससे आपको एक्स से वाई में किए गए प्रदर्शन लाभ पर ऊपरी सीमा मिल जाएगी। लेकिन यह एक्स के प्रदर्शन को किसी भी संभावित वास्तविक दुनिया के उपयोग से कम करने के द्वारा करता है। और अपने मामले को साबित करने के लिए आपको एक निम्न-सीमा अनुमान की आवश्यकता है, न कि ऊपरी-सीमा अनुमान। तो मुझे यकीन नहीं है कि आप अधिक हासिल करेंगे, जब तक कि आप यह न खोजें कि यहां तक ​​कि यह सबसे खराब मामला अभी भी कोई महत्वपूर्ण अंतर नहीं बनाता है और आपको अनुकूलन से परेशान करने की आवश्यकता नहीं है।

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

प्रदर्शन में वास्तविक दुनिया के अंतर को देखने का सबसे अच्छा तरीका है, अपनी कक्षा के वास्तविक विश्व ग्राहक को मापना। आप कहते हैं कि "एक्स और वाई के अर्थशास्त्र इस सूक्ष्मता से संबंधित अन्य सूक्ष्म तरीकों से भिन्न नहीं हैं", इस मामले में मैं केवल यह सिफारिश कर सकता हूं कि आप एक कक्षा जेड लिखें जो X से केवल से भिन्न है और इस उपयोग के संबंध में उपयोग करें तुलना में आपके आवेदन में।

एक बार आपके परीक्षण सबसे खराब यथार्थवादी उपयोग का प्रतिनिधित्व करने का प्रयास करते हैं, तो यदि आप प्रदर्शन में कोई अंतर नहीं देख रहे हैं तो शायद कोई प्रदर्शन लाभ नहीं हुआ है।

यह सब कहा गया है, अगर यह तार्किक अर्थ बनाता है (यानी, यह कोड को और अधिक आश्चर्यजनक नहीं बनाता है), तो मैं अंगूठे के नियम के रूप में सी ++ में ढेर आवंटन की संख्या को कम करने की वकालत करता हूं। यह गति या कुल मेमोरी उपयोग को और खराब नहीं करता है, और यह आपके संसाधन हैंडलिंग को सरल बनाता है। अंगूठे का नियम निश्चित रूप से कार्य कोड के पुनः लिखने को उचित नहीं ठहराता है।

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