2010-03-03 19 views
6

जब मैं कॉलेज में सी ++ का उपयोग कर रहा था, तो मुझे बहुआयामी सरणी (इस प्रकार एमडीए) का उपयोग करने के लिए कहा गया था, क्योंकि यह एक बड़ी हिस्से में आवंटित होने के बाद से बेहतर स्मृति इलाके का प्रदर्शन करता है। दूसरी ओर, सरणी (एओए) के ऐरे को कई छोटे हिस्सों में आवंटित किया जाता है, जहां संभवतः भौतिक स्मृति में रिक्त स्थान पाए जाते हैं।सरणी बनाम बहु-आयामी सरणी

तो मुझे लगता है कि पहला सवाल यह है: क्या यह एक मिथक है, या यह सलाह देने योग्य है?

यह मानते हुए कि यह बाद वाला है, तो अगला प्रश्न जावा जैसी भाषा में क्या करना होगा जिसमें वास्तविक एमडीए नहीं है। निश्चित रूप से 1 डीए के साथ एमडीए का अनुकरण करना मुश्किल नहीं है। अनिवार्य रूप से, एमडीए के साथ भाषाओं के लिए वाक्य रचनात्मक चीनी क्या है एमडीए के बिना भाषाओं के लिए लाइब्रेरी समर्थन के रूप में लागू किया जा सकता है।

क्या यह प्रयास योग्य है? क्या यह जावा जैसी भाषा के लिए अनुकूलन समस्या का बहुत कम स्तर है? क्या हमें केवल सरणी छोड़ने के लिए सरणी छोड़कर List का उपयोग करना चाहिए?


एक और सवाल: जावा में, AoA एक ही बार में (new int[M][N]) का आवंटन करता है संभवतः पदानुक्रम (new int[M][]; for (... new int[N]) यह कर तुलना में एक अलग स्मृति आवंटन उपज?

+2

यह भी देखें http://stackoverflow.com/questions/2512082/java-multi-dimensional-array-vs-one-dimensional, जिसमें वास्तविक बेंचमार्क परिणाम होते हैं। – rwong

उत्तर

3

जावा और सी # सी ++ करता है कि बहुत अलग फैशन में स्मृति आवंटित करें। वास्तव में, एनईटी में निश्चित रूप से एओए के सभी सरणी एक साथ बंद हो जाएंगे यदि उन्हें एक के बाद एक आवंटित किया जाता है क्योंकि स्मृति में किसी भी विखंडन के बिना केवल एक निरंतर हिस्सा होता है।

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

+0

"उदाहरण के लिए, एक int [128] [2] उदाहरण 3,600 बाइट लेता है। 1,040 बाइट्स की तुलना में एक int [256] उदाहरण उपयोग करता है (जिसमें समान क्षमता है), 3,600 बाइट 246 प्रतिशत ओवरहेड का प्रतिनिधित्व करते हैं।" - http://www.javaworld.com/article/2077496/testing-debugging/java-tip-130--do-you-now-your-data-size-.html – Sonny

0

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

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

1

क्या यह प्रयास योग्य है? क्या यह जावा जैसी भाषा के लिए अनुकूलन समस्या का बहुत कम स्तर है?

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

क्या हमें केवल सरणी छोड़ने और प्राइमेटिव के लिए सूची का उपयोग करना चाहिए?

मैं अब तक नहीं जाऊंगा। यह मानते हुए कि आप एक पूर्व निर्धारित आकार की सरणियों के साथ काम कर रहे हैं:

  • वस्तुओं की सरणियों थोड़ा तेजी से वस्तुओं के बराबर सूचियों से हो जाएगा, और
  • पुरातन के एरे काफी तेज हो सकता है और बराबर की तुलना में काफी कम जगह ले जाएगा आदिम रैपर की सूचियां।

दूसरी ओर, यदि आपके एप्लिकेशन को सरणी को "बढ़ने" की आवश्यकता है, तो सूची का उपयोग करके आपके कोड को सरल बना दिया जाएगा।

0

जावा में व्यक्तिगत अनुभव से, बहु-आयामी सरणी एक आयामी सरणी से बहुत धीमी हैं यदि कोई बड़ी मात्रा में डेटा लोड कर रहा है, या विभिन्न स्थितियों में मौजूद डेटा में तत्वों तक पहुंच रहा है। मैंने एक कार्यक्रम लिखा जिसने बीएमपी प्रारूप में एक स्क्रीन शॉट छवि ली, और फिर एक छोटी छवि के लिए स्क्रीनशॉट की खोज की। एक बहुआयामी सरणी (तीन आयामी, [xPos] [yPos] [रंग] में रंगशॉट छवि (लगभग 3 एमबी) लोड हो रहा है (रंग = 0 लाल मान होने के साथ, और इस तरह के)) 14 सेकंड ले लिया। इसे एक आयामी सरणी में लोड करने के लिए 1 सेकंड लिया। बड़ी छवि में छोटी छवि खोजने के लिए लाभ समान था। बड़ी छवि में छोटी छवि को खोजने के लिए लगभग 28 सेकंड लग गए जब दोनों छवियों को बहु-आयामी सरणी के रूप में संग्रहीत किया गया था। बड़ी छवि में छोटी छवि को खोजने के लिए लगभग एक सेकंड लग गया जब दोनों छवियों को एक आयामी सरणी के रूप में संग्रहीत किया गया था। उस ने कहा, मैंने पहली बार पठनीयता के लिए एक आयामी सरणी का उपयोग करके अपना कार्यक्रम लिखा था।

+0

क्या आप सुनिश्चित हैं कि समस्या सरणी है? यह कहना आसान है कि जावा में कुछ धीमा है, यह समझने के बिना कि JVM कैसे काम करता है ... आपको गर्मजोशी का समय और उस जेवीएम के प्रकार पर विचार करना चाहिए जिसका आप उपयोग कर रहे हैं (क्लाइंट या सर्वर)। शुरुआती चरणों में जब कार्यक्रम शुरू हुआ तो आपको धीमी गति मिल जाएगी। – ceklock

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