2015-09-23 10 views
6

में पूर्णांक डेटा प्रकार मैं एक आवेदन जहां प्रदर्शन काफी महत्वपूर्ण है लिख रहा हूँ कम। मैं थोड़ा उलझन में हूं क्योंकि x64 CPUs के लिए सबसे कुशल डेटा प्रकार कौन सा है। बिटमैप उत्पन्न करने के लिए (एक दांतेदार सरणी [10 या उससे अधिक] [30] [128,128] में 5 लाख मूल्यों के आसपास औसत)कुशल कोड: बनाम VB.Net

MDSN कहते "In some cases, the common language runtime can pack your Short variables closely together and save memory consumption." कि लेकिन यह भी है कि "The Integer data type provides optimal performance on a 32-bit processor"

मैं डेटा की एक बड़ी राशि का उपयोग कर रहा वास्तविक समय में (डेटा मूल्यों के ताप मानचित्र)। सभी डेटा पॉइंट 200 से 3500 के बीच पूरी संख्या हैं इसलिए मैं छोटा या पूर्णांक का उपयोग कर सकता हूं। कौन सा सबसे कुशल होगा?

धन्यवाद।

+2

क्या "विशाल" का अर्थ है? क्या आपको पूर्णांक के साथ 'OutOfMemoryException' प्राप्त करने का खतरा है? अन्यथा पूर्णांक का उपयोग करें, एक सीपीयू 32-बिट मानों के साथ कुशलता से काम करने के लिए डिज़ाइन किया गया है। –

+0

औसत 128 * 128 * 30 * 10 डेटा मान (4915200) पर एक जंजीर सरणी में। मेमोरी का उपयोग ठीक है, मेरी मशीन पर लगभग 230 एमबी जो कंपनी के लिए औसत कल्पना है। कारण मैं पूछ रहा हूं क्योंकि मैं छवियों के वास्तविक समय में हेरफेर कर रहा हूं (रंगों को बदल रहा हूं) इसलिए मुझे इसे यथासंभव कुशल होने की आवश्यकता है। – Absinthe

+0

यदि आप कच्चे डेटा के लिए एक छोटी मेमोरी पदचिह्न चाहते हैं तो कम उपयोग करें। यदि आप छवियों के तेज़ प्रतिपादन चाहते हैं तो एक और डेटा प्रकार सही विकल्प हो सकता है, लेकिन जांच करने के लिए कोई कोड नहीं है जो दिखाता है कि डेटा का उपयोग कैसे किया जाता है। – dbasnett

उत्तर

0

एक सामान्य नियम, कम स्मृति एक चर का उपयोग करता है के रूप में, यह तेजी से कार्रवाई की जाएगी और आप बेहतर स्मृति प्रबंधन करना होगा क्योंकि आपके आवेदन यह की कम मात्रा का प्रयोग करेंगे।

लघु केवल, स्मृति पूर्णांक जरूरतों के आधे की जरूरत है यदि आप केवल एक 16 बिट संख्या की जरूरत है और आप यकीन है कि यह बड़ा कभी नहीं होगा, कम का उपयोग कर रहे हैं।

+1

उत्तर के लिए धन्यवाद। यह अच्छा होगा कि इसे किसने रेट किया है, यह बताने के लिए क्यों। – Absinthe

1

Int32 प्रकार, नियमित रूप से चर के लिए सबसे कारगर है उदाहरण के पाश काउंटर के लिए दोनों 32 बिट और 64 बिट अनुप्रयोगों में।

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

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

Int16 का उपयोग Int32 से अधिक कुशल होने की संभावना है जो कि कई कैश ब्लॉक फैलाने के लिए पर्याप्त है, और कैश ब्लॉक आमतौर पर केवल कुछ किलोबाइट होता है।

के रूप में अपने मूल्यों सिर्फ 12 बिट में स्टोर करने के लिए संभव हो रहे हैं, यह और भी 1.5 बाइट में प्रत्येक मान स्टोर करने के लिए eventhough उस डेटा को संभालने के लिए अधिक संसाधन का मतलब कुशल हो सकता है। डेटा प्रोसेसिंग का 25% की कमी अतिरिक्त प्रसंस्करण के लिए तैयार हो सकती है।

+0

उत्तर के लिए धन्यवाद। मैं तत्वों को फिर से चलाने के लिए सरणी के प्रत्येक आयाम के लिए एक लूप (चरण 1) का उपयोग करता हूं, इसलिए मुझे लगता है कि यह काफी रैखिक पहुंच की ओर जाता है। क्या आप कृपया स्पष्टीकरण दे सकते हैं "यह 1.5 बाइट्स में प्रत्येक मान को स्टोर करने के लिए और भी अधिक कुशल हो सकता है" - आप यह कैसे करेंगे? जवाबों की विविधता को देखते हुए मुझे लगता है कि प्रत्येक विकल्प का परीक्षण करना सबसे अच्छा है :) – Absinthe

+0

@ एबिन्तेहे: जैसा कि स्पष्ट रूप से 1.5 बाइट डेटा प्रकार नहीं है, आप दो बाइट्स के हिस्सों में एक मान को स्टोर करेंगे, या बड़े डेटा में कई मान प्रकार। आप 12 बिट मान 'ए' और' बी' को तीन बाइट्स में स्टोर कर सकते हैं: 'aaaaaaa aaaabbbb bbbbbbbb'। आप चार इंटिस्ड बिट्स के साथ 'इंट 64' (8 बाइट्स) में पांच मान (60 बिट) स्टोर भी कर सकते हैं। 'Int64' सरणी से 12 बिट मान मान पढ़ने के लिए आप' (arr [i/5] >> ((i% 5) * 12)) और 0xFFF' का उपयोग करेंगे। – Guffa