2012-01-22 22 views
9

के लिए वे क्या हाल ही में मैंने सीखा है कि प्रत्येक गणना चक्र मशीन शब्दों पर निष्पादित करता है जो अधिकांश समकालीन प्रोसेसर और ओएसई 32-बिट या 64-बिट होते हैं। तो 0 बिट, Int8, Word8 जैसे छोटे बिट-आकार मानों का उपयोग करने के क्या फायदे हैं? वे वास्तव में क्या हैं? क्या यह केवल भंडारण में कमी है?'बिट 8' जैसे कम बिट्सइज़ इंटीग्रल प्रकारों का उपयोग करना और

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

उत्तर

6

ये छोटे प्रकार आपको केवल स्मृति में कमी देते हैं जब आप उन्हें अनबॉक्स किए गए सरणी या समान में संग्रहीत करते हैं। वहां, प्रत्येक प्रकार के प्रत्यय द्वारा संकेत के अनुसार कई बिट्स ले जाएगा।

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

प्रश्न के बारे में प्रश्न Word64 का उपयोग करने के लिए या छोटे प्रकारों का उपयोग करने के लिए, जो निर्भर करता है। 64-बिट सिस्टम पर, ऑप्टिमाइज़ेशन के साथ संकलन करते समय, Word और Word64 का प्रदर्शन अधिकतर होना चाहिए, क्योंकि यह महत्वपूर्ण है कि दोनों को अनपॅक किया जाना चाहिए और कच्चे मशीन Word# पर काम किया जाता है। लेकिन शायद Word के लिए अभी भी कुछ नियम हैं जिनके पास अभी तक Word64 समकक्ष नहीं है, इसलिए शायद सभी के बाद एक अंतर है।एक 32-बिट सिस्टम पर, Word64 पर सबसे संचालन सी कॉल के माध्यम से लागू किया जाता है, तो Word64 पर वहाँ आपरेशन ज्यादाWord पर कार्रवाई की तुलना में धीमी है।

तो क्या अधिक महत्वपूर्ण है पर निर्भर करता है, कोड या अलग सिस्टम पर प्रदर्शन की सादगी, या तो

  1. उपयोग Word64 भर: सरल कोड 64-बिट सिस्टम
  2. उपयोग Word पर, अच्छे प्रदर्शन के रूप में लंबे समय के रूप में आपके मूल्यों को 32 बिट्स में फिट करने की गारंटी है और नवीनतम सुरक्षित पल पर Word64 में बदलना है: अधिक जटिल कोड, लेकिन 32-बिट सिस्टम पर बेहतर प्रदर्शन।
+0

धन्यवाद डैनियल! कृपया उस टिप्पणी पर विचार करें जिसे मैंने एहर्ड के उत्तर में छोड़ा था। चूंकि आमतौर पर आपके उत्तर समान होते हैं, यह आपको भी संबोधित करता है। –

+0

अद्यतन उत्तर। आपकी स्थिति और लक्ष्य के आधार पर, मैं एहर्ड से असहमत हो सकता हूं। –

8

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

आपको अपने द्वारा उपयोग किए जा रहे मूल्यों की श्रेणी के लिए उपयुक्त प्रकार चुनना चाहिए। maxBound :: Word8 255 है, 255 + 1 :: Word8 0 है - और यदि आप ऑक्टेट्स से निपट रहे हैं, तो वही है जो आप चाहते हैं।

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

तो, प्रदर्शन के लिए उनका उपयोग न करें; यदि आप अपने विशिष्ट अर्थशास्त्र की तलाश में हैं तो उनका उपयोग करें: परिभाषित ओवरफ्लो व्यवहार के साथ निश्चित-आकार अभिन्न प्रकार।

+0

हमेशा की तरह आप और बचाव के लिए डैनियल!) ठीक है, तो आम तौर पर 'Int' और' Word' उन छोटे प्रकारों से बेहतर होते हैं - मुझे यह मिलता है। लेकिन दूसरे प्रश्न के बारे में मैं क्या इंगित कर रहा था: क्या यह अभी भी 'वर्ड' में सभी आंतरिक परिचालनों को करने के लिए और अधिक प्रभावी होगा यदि मुझे पता है कि अंत में मैं अभी भी उन मानों को 'वर्ड 64' पर अपमानित करना चाहता हूं, या करता हूं इस परिदृश्य में शुरुआत से हर जगह 'वर्ड 64' का उपयोग करने के लिए यह समझ में आता है और इस प्रकार' से इंटग्रल 'रूपांतरणों को समाप्त कर कुछ चक्रों को छोड़ देता है? –

+1

यदि आप 'वर्ड 64' परिणाम का उत्पादन करना चाहते हैं, तो मैं इंटरमीडिएट कंप्यूटेशंस के लिए भी' वर्ड 64' का उपयोग करूंगा। 64-बिट मशीन पर, यह एक मशीन शब्द होगा, इसलिए कोई प्रदर्शन समस्या नहीं होनी चाहिए, और 'से इंटेग्रल' रनटाइम पर एनओपी होगा। – ehird

+0

कोई जगह बचत नहीं है? मैंने सोचा कि बैंगपर्टर्न के साथ वे डेटा कन्स्ट्रक्टर में जगह बचाएंगे। – user239558