2009-10-05 6 views
9

चूंकि रैम the new disk लगता है, और चूंकि उस कथन का भी अर्थ है कि स्मृति तक पहुंच अब धीमी मानी जाती है कि डिस्क एक्सेस हमेशा कैसे होती है, मैं उच्च प्रदर्शन अनुप्रयोगों के लिए स्मृति में संदर्भ की स्थानीयता को अधिकतम करना चाहता हूं। उदाहरण के लिए, एक क्रमबद्ध इंडेक्स में, मैं आसन्न मानों को बंद करना चाहता हूं (कहने के विपरीत, हैशटेबल में), और मैं चाहता हूं कि इंडेक्स भी बंद हो रहा है।प्रबंधित कोड में, मैं संदर्भ के अच्छे इलाके को कैसे प्राप्त करूं?

सी में, मैं एक विशेष मेमोरी मैनेजर के साथ डेटा संरचना को चाबुक कर सकता हूं, जैसे कि (बेहद जटिल) डेवलपर्स Judy array ने किया था। पॉइंटर्स पर प्रत्यक्ष नियंत्रण के साथ, वे पॉइंटर मूल्य में अतिरिक्त जानकारी को एन्कोड करने के लिए अब तक गए थे। पाइथन, जावा या सी # में काम करते समय, मैं इस प्रकार के समाधान से जानबूझकर एक (या अधिक) स्तर का अबास्ट्रक्शन हूं और मैं जेआईटी कंपाइलर्स को सौंप रहा हूं और मेरे लिए निम्न स्तर पर चालाक चाल करने के साथ रनटाइम को अनुकूलित कर रहा हूं। ।

फिर भी, मुझे लगता है कि, यहां तक ​​कि अमूर्त के इस उच्च स्तर पर, वहाँ चीजें हैं जो शब्दार्थ "करीब" माना जा सकता है और इसलिए निम्न स्तर पर वास्तव में करीब होने की संभावना है कर रहे हैं। उदाहरण के लिए, मैं निम्नलिखित के बारे में सोच रहा था (मेरे अनुमान कोष्ठक में):

  • क्या मैं एक सरणी को स्मृति के आसन्न ब्लॉक (हां) होने की उम्मीद कर सकता हूं?
  • एक ही उदाहरण में दो पूर्णांक एक ही कक्षा (संभवतः) के विभिन्न उदाहरणों में दो से करीब हैं?
  • क्या कोई ऑब्जेक्ट स्मृति (नहीं) में एक संगत क्षेत्र पर कब्जा करता है?
  • केवल दो int फ़ील्ड और दो int[] फ़ील्ड वाले ऑब्जेक्ट्स की एक सरणी के बीच क्या अंतर है? (यह उदाहरण शायद जावा विशिष्ट है)

मैंने जावा संदर्भ में इनके बारे में सोचना शुरू कर दिया, लेकिन मेरी सोच अधिक सामान्य हो गई है, इसलिए मैं जावा प्रश्न के रूप में इसका इलाज नहीं करने का सुझाव दूंगा।

+0

इसके अलावा, कैश नया सीडी-रोम है ... और अब आप अपने प्रदर्शन के लिए आंतरिक कार्यान्वयन विवरण पर भरोसा कर रहे हैं। .NET के लिए एक सर्विस पैक जो दृश्यों के पीछे चीजें कैसे काम करता है और आपका पूरा ढेर गिरता है ... – wefwfwefwe

+0

@wefwfwefwe: और आपका बिंदु है - वास्तव में क्या? यहां तक ​​कि यदि किसी भी मानक द्वारा हनो के प्रश्नों के उत्तर की गारंटी नहीं है, तो आपको अनुकूलन की आवश्यकता होने पर अनुकूलित करने के लिए _something_ का उपयोग करना होगा। – hjhill

+0

बिंदु यह है कि आप .NET/जावा डेवलपर्स से बाहर निकलने की कोशिश कर अपने आप को ऐसा करने की कोशिश कर रहे हैं जो उन्हें आपके लिए किया गया था। – wefwfwefwe

उत्तर

8
  • .NET में, सरणी के तत्व निश्चित रूप से संगत होते हैं। जावा में मैं उन्हें सबसे अधिक कार्यान्वयन में होने की उम्मीद करता हूं, लेकिन ऐसा लगता है कि इसकी गारंटी नहीं है।
  • मुझे लगता है कि यह मानना ​​उचित है कि फ़ील्ड के लिए एक उदाहरण द्वारा उपयोग की गई स्मृति एक ही ब्लॉक में है ... लेकिन यह न भूलें कि उनमें से कुछ फ़ील्ड अन्य ऑब्जेक्ट्स के संदर्भ हो सकते हैं।

जावा सरणी भाग के लिए, Sun's JNI documentation इस टिप्पणी भी शामिल है, तार के बारे में चर्चा में रखा:

उदाहरण के लिए, जावा आभासी मशीन समीपवर्ती सरणियों की दुकान नहीं हो सकता है।

अपने पिछले प्रश्न के लिए, अगर आप दो int[] है तो उन सरणियों से प्रत्येक स्मृति का एक सन्निहित ब्लॉक हो जाएगा, लेकिन वे स्मृति में बहुत "दूर" हो सकता है। यदि आपके पास दो int फ़ील्ड वाले ऑब्जेक्ट्स की एक सरणी है, तो प्रत्येक ऑब्जेक्ट एक दूसरे से लंबा रास्ता हो सकता है, लेकिन प्रत्येक ऑब्जेक्ट के भीतर दो पूर्णांक एक साथ बंद हो जाएंगे। संभावित रूप से अधिक महत्वपूर्ण बात यह है कि आप प्रति-ऑब्जेक्ट ओवरहेड के कारण "बहुत सारी ऑब्जेक्ट्स" समाधान के साथ लॉट अधिक मेमोरी ले लेंगे। .NET में आप एक कस्टम संरचना का उपयोग दो पूर्णांक के साथ कर सकते हैं, और उनमें से एक सरणी है - जो सभी डेटा को एक बड़े ब्लॉक में रखेगी।

मुझे विश्वास है कि दोनों जावा और .NET में, यदि आप एक ही धागे के भीतर जल्दी जल्दी में छोटा सा वस्तुओं का एक बहुत आवंटित तो उन वस्तुओं संभावना हैं संदर्भ के अच्छे इलाके है। जीसी एक ढेर काम्पैक्ट है, यह सुधार हो सकता है - या यह संभावित रूप से भी बदतर हो सकता है, अगर

A B C D E 

साथ एक ढेर

A D E B 

(जहां सी एकत्र किया जाता है) करने के लिए जमा किया जाता है - अचानक ए और बी , जो पहले "करीबी" हो सकता है, बहुत दूर हैं। मुझे नहीं पता कि यह वास्तव में किसी भी कचरा कलेक्टर में होता है (वहां लोड हैं!) लेकिन यह संभव है।

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

+2

क्या आप निश्चित रूप से जावा सरणी के बारे में सुनिश्चित हैं? हालांकि अधिकांश वीएम शायद स्मृति के एक संगत ब्लॉक में जावा सरणी आवंटित करते हैं, मुझे भाषा या वीएम विनिर्देश में इसके लिए कोई आवश्यकता नहीं मिल सकती है। यदि एक संगत ब्लॉक की गारंटी दी गई थी, तो जेएनआई कार्यों को सरणी तक पहुंचने के लिए काम करता है, बल्कि स्मृति की एक सूचक को मूल कार्य में पारित किया जा सकता है। – jarnbjo

+0

अच्छा जवाब, लेकिन ... ।नेट प्रबंधित ऑप के नीचे (या शीर्ष) से ​​संगत स्मृति के एक हिस्से को पकड़कर बस किसी ऑब्जेक्ट के लिए स्मृति आवंटित करता है। तो एक obujects सदस्य चर हमेशा राम में आसन्न होगा। हालांकि, एक संदर्भ प्रकार के लिए, इसका मतलब है कि सूचक निकट है। जहां यह इंगित करता है कि उस वस्तु पर निर्भर करेगा जब वह जिस वस्तु को इंगित करता है उसका निर्माण किया गया था। एक सरणी एक वस्तु है, इसलिए यह सरणी तत्वों के सदस्यों के साथ एक सरणी पर लागू होगा। – pipTheGeek

+0

@pip: मैंने सोचा कि मैं उन सभी को कवर करूँगा, है ना? (मेरी दूसरी बुलेट देखें।) –

3

पहला, आपका शीर्षक सी # का अर्थ है। "प्रबंधित कोड" एक शब्द है जिसे माइक्रोसॉफ्ट द्वारा बनाया गया है, अगर मुझे गलत नहीं लगता है।

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

int[] array = new int[4]; 

है, तो आप JNI (देशी सी) से कर सकते हैं एक int *p वास्तविक सरणी को इंगित करने के लिए मिल। मुझे लगता है कि यह एरे * कंटेनरों के वर्ग के लिए भी जाता है (ArrayList, ArrayBlockingQueue, आदि)।

जेवीएम के शुरुआती कार्यान्वयन में वस्तुओं को संगत संरचना के रूप में रखा गया था, मुझे लगता है, लेकिन इसे नए जेवीएम के साथ नहीं माना जा सकता है। (जेएनआई इसे दूर कर देता है)।

उसी ऑब्जेक्ट में दो पूर्णांक जैसा कि आप शायद "करीब" कहेंगे, लेकिन वे नहीं हो सकते हैं। यह संभवतः एक ही JVM का उपयोग करके भिन्न हो जाएगा।

दो int फ़ील्ड वाला एक ऑब्जेक्ट एक ऑब्जेक्ट है और मुझे नहीं लगता कि कोई भी JVM कोई गारंटी देता है कि सदस्य "बंद" होंगे। दो तत्वों के साथ एक इंट-सरणी को 8 बाइट लंबी सरणी द्वारा समर्थित किया जाएगा।

+0

जॉन के जवाब में जर्नबोजो और जॉन स्कीट जावा सरणी पर चर्चा कर रहे थे और निष्कर्ष निकाला कि वे संभावित हैं, लेकिन गारंटी नहीं है, जो संगत होने के लिए हैं। क्या जेएनआई में आदिम बनाम संदर्भ प्रकारों के सरणी के बीच कोई अंतर है? –

+0

"प्रबंधित कोड" एक ऐसा शब्द है जो प्रबंधित वातावरण में चलने वाली किसी भी भाषा को इंगित करने के लिए उपयोग किया जाता है - यानी एक JVM या .NET Framework। एमएस विंडोज के लिए इसे और देशी कोडिंग के बीच अंतर करने के लिए सबसे अधिक उपयोग करता है, जबकि जावा को इस तरह के भेद करने की आवश्यकता नहीं है। – gbjbaanb

+0

मैंने .NET दायरे के बाहर "प्रबंधित कोड" शब्द कभी नहीं सुना है। .NET के साथ आने से पहले, जावा लोगों ने जेवीएम और बाइटकोड के बारे में बात की, प्रबंधित कोड नहीं। – JesperE

2

के साथ संबंध है यहां सरणियों को CLI (सामान्य भाषा इन्फ्रास्ट्रक्चर) विनिर्देश से एक अंश है:

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

2

अच्छा प्रश्न है! मुझे लगता है कि मैं में एक्सटेंशन लिखने का सहारा होगा सी ++ जो स्मृति को अधिक सावधानीपूर्वक प्रबंधित तरीके से संभालता है और केवल कुछ इंटरफ़ेस को उजागर करता है ताकि शेष एप्लिकेशन ऑब्जेक्ट्स में हेरफेर कर सकें।अगर मैं प्रदर्शन के बारे में चिंतित था तो शायद मैं एक सी ++ एक्सटेंशन का सहारा लेगा।

+0

अच्छा सुझाव भी, विशेष रूप से क्योंकि यह आपको कई वीएम भाषाओं के बीच अपना समाधान बंद करने की अनुमति देगा। लेकिन निश्चित रूप से, उस दृष्टिकोण में आसानी से काम का एक टन शामिल हो सकता है, और उसके बाद आप अपने वर्तमान माहौल के अंदर क्या कर सकते हैं इसके बारे में कुछ और जानना बहुत आसान हो सकता है। –

+0

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

-3

आप उस स्तर तो मुझे लगता है एक वी एम आधारित भाषा तुम्हारे लिए नहीं है करने के लिए अनुकूलन करने के लिए की जरूरत है;)

+4

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

+0

जो भी हो। यदि आप स्मृति को माइक्रो प्रबंधित करना चाहते हैं तो उस भाषा का उपयोग करें जहां आप मैन्युअल रूप से स्मृति प्रबंधित करते हैं। – wefwfwefwe

2

मुझे नहीं लगता कि किसी को भी अजगर के बारे में बात की है तो मैं एक जाना

होगा

क्या मैं एक सरणी को स्मृति के आसन्न ब्लॉक (हां) होने की उम्मीद कर सकता हूं?

पायथन एरे में सी में पॉइंटर्स के सरणी की तरह अधिक हैं तो पॉइंटर्स आसन्न होंगे, लेकिन वास्तविक वस्तुएं होने की संभावना नहीं है।

उसी उदाहरण में दो पूर्णांक एक ही कक्षा (संभवतः) के विभिन्न उदाहरणों में दो से अधिक हैं?

शायद ऊपर जैसा ही कारण नहीं है। उदाहरण केवल उन वस्तुओं को पॉइंटर्स रखेगा जो वास्तविक पूर्णांक हैं। पायथन में देशी int (जावा की तरह) नहीं है, केवल बॉक्स किए गए इंट (जावा-स्पीच में)।

क्या कोई ऑब्जेक्ट स्मृति (नहीं) में एक संगत क्षेत्र पर कब्जा करता है?

शायद नहीं। हालांकि यदि आप __slots__ अनुकूलन का उपयोग करते हैं तो इसके कुछ हिस्सों में संगत होगा!

ऑब्जेक्ट्स की सरणी के बीच केवल दो int फ़ील्ड और एक ऑब्जेक्ट के साथ दो int [] फ़ील्ड के बीच क्या अंतर है? (यह उदाहरण शायद जावा विशिष्ट है)

मेमोरी इलाके के मामले में अजगर में, वे दोनों काफी समान हैं! एक ऑब्जेक्ट्स के पॉइंटर्स की एक सरणी बना देगा जो बदले में दो पॉइंटर्स को इन्ट्स में रखेगा, दूसरा पॉइंटर्स के दो एरे को पूर्णांक में बनाएगा।

+0

ग्रेट, धन्यवाद! मुझे लगता है कि यहां कई वीएम भाषाओं के बारे में थोड़ी सी जानकारी मिल जाएगी। –

+1

मुझे लगता है कि यह थोड़ा भ्रामक है क्योंकि पाइथन के पास सरणी नहीं है, केवल सूचियां हैं, जो बताए गए पायओब्जेक्ट्स के पॉइंटर्स की एक सरणी होगी। हालांकि यह एक सरणी मॉड्यूल (http://docs.python.org/library/array.html) और एक स्ट्रक्चर मॉड्यूल भी प्रदान करता है (http://docs.python.org/library/struct.html) जिनमें से प्रत्येक देगा आप अधिक बारीकी से और अनुमानित रूप से पैक डेटा। – Kylotan

+0

@ किलोटान आप निश्चित रूप से सही हैं - मैं सामान्य पायथन उपयोग में प्रश्न की कुछ जावा उन्मुख प्रकृति का अनुवाद करने का प्रयास कर रहा था। अगर आप बेहतर मेमोरी इलाके प्राप्त करना चाहते हैं तो सरणी मॉड्यूल सबसे निश्चित रूप से एक लायक होगा। –

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