टिप्पणी संदर्भ के रूप में, देखें: http://java-performance.info/string-intern-in-java-6-7-8/। यह बहुत अंतर्दृष्टिपूर्ण संदर्भ है और मैंने बहुत कुछ सीखा, हालांकि मुझे यकीन नहीं है कि इसके निष्कर्ष जरूरी हैं कि "एक आकार सभी फिट बैठता है"। प्रत्येक पहलू आपके अपने आवेदन की जरूरतों पर निर्भर करता है - यथार्थवादी इनपुट डेटा के माप को अत्यधिक अनुशंसा की जाती है!
मुख्य कारक है शायद पर निर्भर करता है कि आप क्या पर नियंत्रण में हैं:
आप जी सी की पसंद पर पूरा नियंत्रण है? उदाहरण के लिए जीयूआई आवेदन में, सीरियल जीसी का उपयोग करने के लिए अभी भी एक मजबूत मामला बनना है। (प्रक्रिया के लिए बहुत कम स्मृति मेमोरी पदचिह्न - एक साधारण जटिल ऐप के लिए 400 एमबी बनाम ~ 1 जीबी सोचें, और उपयोग में एक क्षणिक स्पाइक के बाद, अधिक इच्छुक रिलीज मेमोरी होने के नाते)। तो आप इसे चुन सकते हैं या अपने उपयोगकर्ताओं को विकल्प दे सकते हैं। (यदि ढेर छोटा रहता है तो विराम एक बड़ा सौदा नहीं होना चाहिए)।
क्या आपके पास कोड पर पूरा नियंत्रण है?जी 1 जीसी विकल्प तीसरे पक्ष के पुस्तकालयों (और एप्लिकेशन!) के लिए बहुत अच्छा है जिसे आप संपादित नहीं कर सकते हैं।
दूसरा विचार (@ Zhongyu के जवाब के अनुसार) है कि String.intern
डी-डुप्लीकेशन कर सकते हैं String
खुद को वस्तुओं, जबकि G1GC जरूरी केवल डी-डुप्लिकेट कर सकते हैं उनके निजी char[]
क्षेत्र है।
एक तीसरा विचार CPU उपयोग हो सकता है, कहें कि लैपटॉप बैटरी जीवन पर असर आपके उपयोगकर्ताओं के लिए चिंता का विषय हो सकता है। जी 1 जीसी ढेर को डुप्लिकेट करने के लिए समर्पित अतिरिक्त थ्रेड चलाएगा। उदाहरण के लिए, मैंने ग्रहण चलाने के लिए इसके साथ खेला और पाया कि यह शुरू होने के बाद बढ़ी हुई सीपीयू गतिविधि की प्रारंभिक अवधि (1 - 2 मिनट सोचें) लेकिन यह एक छोटे ढेर पर "उपयोग में" बस गया और कोई स्पष्ट नहीं (केवल आंख- टास्क मैनेजर को गेंदबाजी करना) उसके बाद सीपीयू ओवरहेड या धीमा-डाउन। तो मुझे लगता है कि एक सीपीयू कोर का एक निश्चित% उच्च स्मृति-मंथन की अवधि डी-डुप्लिकेशन (दौरान? के बाद) पर लिया जाएगा। (बेशक वहाँ एक तुलनीय भूमि के ऊपर जो होगा भी धारावाहिक में चलता है, लेकिन फिर हो सकता है अगर आप String.intern हर जगह फोन, ...)
आप शायद हर जगह स्ट्रिंग डी-डुप्लीकेशन जरूरत नहीं है।
- वास्तव में लंबी अवधि के ढेर के उपयोग, और
- डुप्लिकेट तार
की एक उच्च अनुपात बनाने String.intern
चुनिंदा, अन्य भागों का उपयोग करके प्रभाव: वहाँ शायद कोड के केवल कुछ क्षेत्रों है कि कर रहे हैं कोड (जो अस्थायी या अर्द्ध अस्थायी तार बना सकता है) कीमत का भुगतान नहीं करते हैं।
और अंत में, अमरूद उपयोगिता के लिए एक त्वरित प्लग: Interner है, जो:
अन्य अपरिवर्तनीय प्रकार
तुम भी उपयोग कर सकते हैं कि तार के लिए के लिए String.intern()
के बराबर व्यवहार प्रदान करता है। मेमोरी शायद आपकी शीर्ष प्रदर्शन चिंता (और होनी चाहिए), इसलिए शायद यह अक्सर लागू नहीं होता है: हालांकि जब आपको कुछ हॉट-स्पॉट क्षेत्र से गति की हर बूंद को निचोड़ने की आवश्यकता होती है, तो मेरा अनुभव यह है कि जावा-आधारित कमजोर संदर्भ हैश मैप समाधान जेवीएम विकल्पों को ट्यून करने के बाद भी String.intern()
के जेवीएम के सी ++ कार्यान्वयन से थोड़ा तेज लेकिन लगातार तेज़ दौड़ते हैं। (और बोनस: आपको विभिन्न इनपुट में स्केल करने के लिए JVM विकल्पों को ट्यून करने की आवश्यकता नहीं है।)
स्रोत
2017-06-15 12:28:02
[सुझाए गए वीडियो] (https://www.youtube.com/watch?v=YgGAUGC9ksk) - लेकिन वैसे भी, निष्कर्ष हमेशा एक ही है: आप। चाहिए। नहीं। देखभाल। – fge
क्षमा करें, क्या परवाह नहीं करना चाहिए? किसके बारे में उपयोग करना है (जिसका अर्थ है वे समकक्ष हैं) या नई सुविधा के बारे में (जिसका अर्थ यह उपयोगी नहीं है) ?? – Hilikus
मतलब: केवल दूसरे स्ट्रिंग के बिना 'स्ट्रिंग' कक्षा का उपयोग करें। – fge