2009-03-25 10 views
7

मैं ऑब्जेक्ट्स के कैश-जैसे संग्रह को कार्यान्वित करने की कोशिश कर रहा हूं। इसका उद्देश्य स्मृति में इलाके के माध्यम से इन वस्तुओं तक तेजी से पहुंच बनाना है क्योंकि मैं एक समय में कई वस्तुओं को पढ़ रहा हूं। मैं वर्तमान में वेक्टर या डेक जैसे जावा संग्रह ऑब्जेक्ट में वस्तुओं को संग्रहीत करता हूं। लेकिन मुझे विश्वास नहीं है कि यह संगत स्मृति का उपयोग करता है।संगत मेमोरी में जावा ऑब्जेक्ट्स स्टोर करने की कोशिश कर रहा है

मुझे पता है कि यह सी में किया जा सकता है, लेकिन क्या यह जावा में किया जा सकता है? ये वस्तुएं अलग-अलग लंबाई के हो सकती हैं (क्योंकि उनमें तार हो सकते हैं)। जावा के माध्यम से संगत स्मृति आवंटित करने का कोई तरीका है? क्या जावा संग्रह ऑब्जेक्ट है जो होगा?

कृपया मुझे बताएं।

धन्यवाद, jbu

+2

संगत स्मृति में इसे संग्रहीत करने से आपको क्या मिलेगा? –

+2

तेज लुकअप, कम पृष्ठ दोष – jbu

+0

क्या यह प्रोफाइलिंग के माध्यम से दिखाया गया है? –

उत्तर

14

आप इसे मजबूर नहीं कर सकते हैं। यदि आप त्वरित उत्तराधिकार में सभी वस्तुओं को आवंटित करते हैं तो वे संगत होने के लिए हैं - लेकिन यदि आप उन्हें संग्रह में संग्रहीत कर रहे हैं, तो इस बात की कोई गारंटी नहीं है कि संग्रह वास्तविक मूल्यों के लिए स्थानीय होगा। (संग्रह में वस्तुओं को संदर्भित करने के बजाए ऑब्जेक्ट्स के संदर्भ होंगे।)

इसके अलावा, जीसी कॉम्पैक्शन स्मृति में चारों ओर मूल्यों को स्थानांतरित करेगा।

क्या आपने वास्तव में अपना ऐप प्रोफाइल किया है और पाया है कि यह एक बाधा है? ज्यादातर मामलों में मुझे उम्मीद है कि अन्य अनुकूलन आपको अधिक विश्वसनीय तरीके से मदद कर सकते हैं।

+1

हाँ, इसे पहले प्रोफाइल करें, इसलिए आप जो भी टूटा नहीं है उसे ठीक करने में समय बर्बाद नहीं करते हैं। –

+0

मैं दूसरा कर दूंगा।यदि यह वास्तव में आपके ऐप के लिए एक बाधा है, तो आप शायद इसे गलत भाषा में लिख रहे हैं। –

4

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

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

+0

आप सही हैं, सही कार्यान्वयन और प्रोफाइलिंग के बाद अनुकूलन आना चाहिए। मैं बस आगे सोचने की कोशिश कर रहा था। हालांकि यह अभी भी जावा सिद्धांत में एक सबक के रूप में कार्य करता है। – jbu

8

नहीं, आप संदर्भ के इस इलाके की गारंटी नहीं दे सकते।

nio पैकेजों से एक बाइट सरणी आवंटित करके या मैप किए गए बाइट बफर का उपयोग करके, आप संगत स्मृति का एक हिस्सा प्राप्त कर सकते हैं, जिससे आप इच्छित डेटा को डीकोड कर सकते हैं (इस खंड से ब्याज की वस्तुओं को प्रभावी ढंग से deserializing याद)। हालांकि, यदि आप बार-बार वही वस्तुओं तक पहुंचते हैं, तो deserialization ओवरहेड संभवतः उद्देश्य को हराने के लिए होगा।

+0

तो ऐसा लगता है कि प्राइमेटिव्स की सरणी को संगत मेमोरी में संग्रहीत किया जा सकता है लेकिन ऑब्जेक्ट्स की सरणी नहीं। क्या वो सही है? – jbu

+1

Arrays संगत हैं - लेकिन यदि आपके पास Foo [] जैसी कोई सरणी है जिसका अर्थ है Foo * संदर्भ * की एक सरणी, Foo * ऑब्जेक्ट्स * नहीं। जावा में उपयोगकर्ता परिभाषित मान प्रकार नहीं हैं। –

-1

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

आप पूरी तरह इस होना आवश्यक है, तो आप दो विकल्प हैं:

1) का प्रयोग करें JNI और ग में लिखने। 2) एक बड़ा बाइट बफर प्राप्त करें और ऑब्जेक्टऑटपुटस्ट्रीम का उपयोग ऑब्जेक्ट्स लिखने के लिए करें। हैश टेबल का उपयोग करने की तुलना में यह बहुत धीमी होगी।

+1

ऑब्जेक्ट संदर्भों से पारित नहीं होते हैं। संदर्भ (और अन्य सभी तर्क भी) मूल्य से पारित होते हैं। एक बड़ा अंतर है, और यह सटीक होने लायक है।

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