2008-10-27 19 views
14

असल में here थोड़ा व्यावहारिक मूल्य वाला एक समान विषय है। जहां तक ​​मैं समझता हूं, प्राइमेटिव बेहतर प्रदर्शन करते हैं और उन मामलों को छोड़कर हर जगह इस्तेमाल किया जाना चाहिए जहां ऑब्जेक्ट से संबंधित विशेषताएं (उदा। null चेक) आवश्यक हैं। सही?वस्तुओं को लपेटने के बजाय मुझे प्राइमेटिव का उपयोग कब करना चाहिए?

उत्तर

23

यह मत भूलना कि प्रत्येक मुक्केबाजी घटना के लिए एक नया रैपर बनाने के बाद काफी महंगा है, विशेष रूप से इसे आमतौर पर विधि के एक दायरे में इस्तेमाल किया जाता है, Autoboxing सामान्य रैपर के पूल का उपयोग करता है।

यह वास्तव में flyweight design pattern का कार्यान्वयन है। जब एक मुक्केबाजी एक नए मूल्य के उदाहरण के बजाय एक प्रसिद्ध मूल्य के लिए होता है, तो एक पूर्व-निर्मित उदाहरण पूल से प्राप्त किया जाता है और लौटाया जाता है।

एक परिणाम यह है: वैज्ञानिक गणनाओं के लिए ऑटोबॉक्सिंग का उपयोग करने की अभी भी अनुशंसा नहीं की जाती है। उदाहरण के लिए, कोड डी = ए * बी + सी ए, बी, सी और डी के लिए इंटीजर कक्षाओं का उपयोग कर रहा है, और जेनरेट कोड d.valueOf (a.intValue() * b.intValue() + c.intValue ())। इन सभी विधिओं के आविष्कारों का अपना ओवरहेड होता है, इसलिए संग्रहों में प्राइमेटिव स्टोर करने के लिए आवश्यक होने पर ऑटोबॉक्सिंग का उपयोग करने की आमतौर पर अनुशंसा की जाती है

और फिर भी, अगर आप पूर्णांक रैपिंग पूर्णांक के विशाल संग्रह है, भूमि के ऊपर अब निष्पादन समय, तात्पर्य यह कर सकते हैं reported in this article रूप 20 गुना तक लंबे समय तक,।


जेबी इस महत्वपूर्ण टिप्पणी जोड़ता है:

इसके अलावा Wrapper.valueOf (आदिम) रैपर के पूल का उपयोग करता है। तो इंटीजर .valueOf (5) को नए इंटीजर (5)

+0

वैज्ञानिक गणना के लिए ऑटोबॉक्सिंग का उपयोग करने की अभी भी अनुशंसा नहीं की जाती है? हां, यह केवल प्रदर्शन की समस्या के लिए है, है ना? – grep

+1

@grep यकीन नहीं है: मैंने लिखा है कि 6 साल से अधिक पहले। – VonC

5

हां, प्राइमेटिव ऑब्जेक्ट्स से तेज़ हैं। जावा 5 के बाद से आप प्राइमेटिव्स और ऑब्जेक्ट्स को मैन्युअल रूप से एक दूसरे में कनवर्ट किए बिना भी मिश्रण कर सकते हैं। ऑटोबॉक्सिंग तंत्र केवल उस पर ख्याल रखता है।

इसका मतलब है कि यदि आप संग्रह में एक आदिम डालते हैं, तो संकलक शिकायत नहीं करेगा, और आदिम को वस्तु को पूर्ण रूप से परिवर्तित करेगा।

+0

वे किस मामले में तेज़ी से हैं? चारों ओर संदर्भ गुजरने के रूप में आसपास के संदर्भ गुजरने के रूप में तेजी से है। उदाहरण के लिए –

+1

एक int ले लो। एक इंटीजर, एक ऑब्जेक्ट है जिसमें एक एकल int फ़ील्ड होता है। एक इंटीजर एक int की तुलना में बहुत अधिक थोक है। यह int शामिल करने के लिए एक Fedex बॉक्स की तरह है। – nkr1pt

10

प्राइमेटिव्स तेज़ होते हैं जब वे का उपयोग करते हैं, क्योंकि वस्तुओं को उपयोग से पहले अनबॉक्स किया जाना आवश्यक है; इस प्रकार वीएम के प्रदर्शन के लिए एक अतिरिक्त कदम है। उदाहरण के लिए, एक इंटीजर पर अंकगणित करने के क्रम में, अंकगणित किए जाने से पहले इसे पहले एक int में परिवर्तित किया जाना चाहिए।

कई व्यावसायिक अनुप्रयोगों में यह शायद ही कभी मायने रखता है। लेकिन अगर आप कुछ बहुत कम संख्या में क्रंचिंग भारी लिख रहे थे, तो कहें, एक ग्राफिक्स ट्रांसफर प्रोसेसर आपको देखभाल करने की बहुत अधिक संभावना है।

1

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

+1

मैं असहमत हूं। जब आप पहली जगह कुशल कोड लिख सकते हैं तो प्रदर्शन की प्रतीक्षा क्यों करें? 10 में से 9 बार आपको रैपर वर्ग की अतिरिक्त कार्यक्षमता की आवश्यकता नहीं है, तो एक का उपयोग क्यों करें? – alexmcchessers

+2

10 बार में से 9 आपको कभी अनुकूलित करने की आवश्यकता नहीं है। अधिकांश बार आप ऑटोबॉक्सिंग कार्यक्षमता से लाभ उठाते हैं अन्यथा पृथ्वी पर क्यों उन्होंने इसे जोड़ा होगा? जब आप कभी ध्यान नहीं देंगे तो अपने जीवन को कठिन बनाने का कोई कारण नहीं है। – carson

+0

जावा भाषा की कई विशेषताएं हैं जिन्हें मुझे कभी-कभी आवश्यकता होती है। यह कहना नहीं है कि वे उपयोगी नहीं हैं या उन्हें जोड़ा नहीं जाना चाहिए था। Autoboxing कुछ परिस्थितियों में एक उपयोगी विशेषता है, लेकिन मुझे लगता है कि उन्हें रखने के लिए केवल रैपर का उपयोग करना अनावश्यक है। – alexmcchessers

1

यदि आपको संग्रह में स्टोर प्राइमेटिव की आवश्यकता है तो आप commons-primitives का उपयोग कर सकते हैं।

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

मैं एक बार परियोजना है कि पुरातन इस्तेमाल किया (और homebrew ORM) डेटाबेस का उपयोग में पर काम किया:

class Foo{ 
    int xxx = -1; 
... 
} 

और फिर आप के लिए किया था:

void persist(Foo foo){ 
    ... 
    statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX()); 
    ... 
} 

भगवान यह बुराई था।