2012-05-20 20 views
7

मैं एक प्रोग्राम प्रोग्रामिंग कर रहा हूं और एक सरणी का उपयोग कर बोर्ड का प्रतिनिधित्व करना चाहता हूं। मैं दक्षता की तलाश में हूं क्योंकि मैं कई पुनरावृत्तियों को करने जा रहा हूं। इस मामले में, एक int सरणी या एक चार सरणी बोर्ड प्रतिनिधित्व के लिए सुविधाजनक लगती है। एक int सरणी और एक चार सरणी में संचालन करते समय दक्षता के मामले में कोई अंतर है?क्षमता: चार सरणी बनाम int सरणी

मुझे संदेह है कि चूंकि चार सरणी के प्रत्येक तत्व में 1 बाइट का आकार होता है, यह स्मृति में एक अलग प्रतिनिधित्व के कारण धीमा हो सकता है (एक आधुनिक कंप्यूटर पर विचार करें जिसमें कम प्रतिनिधित्व के लिए कम से कम 32 बिट्स हैं) ... क्या मैं सही?

अग्रिम धन्यवाद।

संपादित करें: मैं खेल पेड़ उत्पन्न करने जा रहा हूं, यही कारण है कि दक्षता इतनी महत्वपूर्ण है और समय की खपत में छोटे अंतर एक बड़ा अंतर डाल सकते हैं।

+0

मैं किसी भी कारण से नहीं सोच सकता कि 'char' धीमा हो जाएगा। यदि कुछ भी हो, तो संभवतः आप जो संचालन कर रहे हैं उसके आधार पर, यह तेज़ हो सकता है। 8-बिट आर्किटेक्चर के साथ एम्बेडेड लक्ष्यों पर, 'int' संचालन धीमा हो जाएगा। – jedwards

+0

हो सकता है, लेकिन एक 'char' सरणी में कम स्मृति है, जो इसे' int' सरणी से तेज़ कर सकती है, यदि उसके पास पर्याप्त तत्व हैं। –

उत्तर

5

किस सीपीयू/एस के लिए?

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

कुछ CPU बिना किसी समस्या के बाइट्स तक पहुंच सकते हैं। इस मामले में (यदि पर्याप्त डेटा शामिल है तो यह महत्वपूर्ण है) समस्या कैश आकार और/या मेमोरी बैंडविड्थ होने की संभावना है; और (कम से कम 80x86 के लिए) मुझे उम्मीद है कि char बस जीत जाएगा क्योंकि प्रत्येक डेटा प्रत्येक कैश लाइन में पैक किया जाता है।

किस एल्गोरिदम/एस के लिए?

यदि आप इसमें सिम फेंक सकते हैं, char जीतने की संभावना है। उदाहरण के लिए, 128-बिट सिम के साथ आप प्रति निर्देश 16 बाइट्स या प्रति निर्देश 4 (32-बिट) पूर्णांक संसाधित कर सकते हैं और char अकेले इस समय 4 गुना तेज हो सकता है।तो फिर तुम यह कर सकते हैं प्रोफ़ाइल

#ifdef USE_INT 
    typedef int thingy 
#else 
    typedef unsigned char thingy 
#endif 

और आप जब चाहें इसे बदल:

सबसे अच्छा सलाह की तरह कुछ का उपयोग करने के लिए होगा।

+0

+1, लेकिन आपको अपना 'टाइपपीफ' गलत तरीका है। –

+0

हे - यह शर्मनाक है - अभी तय किया गया है। धन्यवाद :-) – Brendan

4

char एस आमतौर पर 1-बाइट गठबंधन और int एस आमतौर पर 4-बाइट गठबंधन होते हैं। मान लीजिए कि आप इस मानक का पालन करने वाली मशीन के साथ काम कर रहे हैं, दोनों सरणी अपनी सामग्री को स्मृति के संगत ब्लॉक के रूप में संग्रहीत करेंगे (int सरणी char सरणी के आकार के 4x होने के कारण)। इस प्रकार, यह असंभव है कि आवंटित स्मृति के एक हिस्से का उपयोग करने के तरीके में कोई भी अलग होगा।

कहा जा रहा है, भले ही अंतर्निहित स्मृति प्रतिनिधित्व कोई अलग था, मुझे संदेह है कि यह आपके प्रोग्राम के थ्रूपुट को प्रभावित करेगा।

+0

मैं पहली वाक्य से सहमत हूं, लेकिन क्या यह इंगित नहीं करेगा कि int प्रतिनिधित्व (32-बिट मशीन पर) 4x स्मृति लेगा? हां, ब्लॉक संगत होंगे, लेकिन एक ही आकार नहीं। – jedwards

+0

मैंने इस बिंदु को स्पष्ट करने के लिए अपना उत्तर अपडेट किया (मुझे लगता है कि पाठक इस पर उठाएगा, लेकिन शायद मुझे और स्पष्ट होना चाहिए था)। –

+0

मुझे लगता है कि मुझे जो वाक्य मिला वह "यह असंभव है कि कुल स्मृति उपयोग के मामले में कोई भी अलग होगा।" - कुल स्मृति उपयोग की शर्तें, वे अलग-अलग होंगी, एक 4x आकार का आकार होगा। – jedwards

3

इसे आज़माएं और देखें। कोडांतरक कोड प्राप्त करने के जीसीसी के लिए एस ध्वज का उपयोग करें:

gcc -Wall -S code.c -o code.s 

देखें अगर वहाँ उत्पन्न कोड की लंबाई में किसी भी स्पष्ट मतभेद हैं। यह पूरी कहानी नहीं है क्योंकि आपको मतभेदों का न्याय करने के लिए असेंबलर को समझने की आवश्यकता है। लेकिन यह आपको एक संकेत दे सकता है - शायद वह int और char बहुत समान होगा।

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

+0

+1! यह निश्चित सबूत होगा जो दावाों की पुष्टि करता है। दोनों महान जवाब, यह एक शर्म की बात है कि मैं सिर्फ एक चुन सकता हूं। – PALEN

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