2011-08-18 10 views
9

एक परियोजना के कई वर्गों में मैं काम कर रहा हूं, मुझे CLASS_NAME नामक निजी स्थिर अंतिम सदस्य दिखाई देते हैं, जिन्हें इस तरह परिभाषित किया गया है:क्या class.getName() महंगा है?

public class MyClass { 
    private static final String CLASS_NAME = MyClass.class.getName(); 
    //... 
} 

कक्षा का नाम प्राप्त करने के लिए ऐसा करने के क्या फायदे हैं, यदि कोई हैं , MyClass.class.getName() कॉल करने के बजाय, जहां नाम की आवश्यकता है?

उत्तर

10

यहाँ आप देख सकते हैं नाम का मान कैश किया गया है, तो कॉल भी महंगा नहीं है Class.getName()

public String getName() { 
if (name == null) 
    name = getName0(); 
return name; 
} 

का कार्यान्वयन है। यह नियमित गेटर की तरह ही है। वैसे भी अगर आप इसे अक्सर कहते हैं तो यह निश्चित रूप से निरंतर परिभाषित करने के लिए एक अच्छी शैली है।

1

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

0

हमें यह देखने के लिए सभी कोड देखना होगा कि CLASS_NAME का उपयोग कैसे किया जा रहा है। हालांकि, यह संभावना कहीं और प्रयोग किया जाता है, तो आप इस तरह Log4J के साथ इस्तेमाल कर सकते हैं, उदाहरण के लिए:

// Log4j . Logger --- Get class name in static context by creating an anonymous Throwable and 
// getting the top of its stack-trace. 
// NOTE you must use: getClassName() because getClass() just returns StackTraceElement.class 
static final Logger logger = Logger.getLogger(new Throwable() .getStackTrace()[0].getClassName()); 

यह एक महंगी आपरेशन नहीं है और संभावना कैश किया गया है।

6

कक्षा के नाम को कैशिंग करने से दूसरे संदर्भ का ओवरहेड होगा। इससे स्मृति पदचिह्न के लिए जेवीएम ओपकोड्स (सीपीयू जटिलता) की लागत बढ़ जाती है।

आजकल सीपीयू इतने तेज़ हैं कि वे मूल रूप से स्मृति पर प्रतीक्षा करते हैं, इसलिए यदि आपको ऑपकोड और मेमोरी पदचिह्न के बीच कोई विकल्प बनाना पड़ा, तो आप JVM के माध्यम से अधिक ऑपकोड चलाने के लिए बेहतर विकल्प चुन सकते हैं।

पहले यह सहज नहीं लगता है; लेकिन, जेवीएम और आसपास के हार्डवेयर पर विचार करें। बड़ी मेमोरी पैरों के निशान का मतलब है कि हाल ही में कैश में कम से कम एक्सेस किए गए आइटम, और कैश से निकलने वाली किसी वस्तु को फिर से लाने की लागत कहीं भी एक जेवीएम ऑपोड चलाने के लिए 1,000 से 10,000 गुना अधिक है। जेवीएम के जिट इंजन के साथ इसे युगल करें, और कोड के भारी एक्सेस किए गए हिस्सों के लिए सीपीयू जटिलता को मुफ्त में अनुकूलित किया जाता है (बाकी सब कुछ के अतिरिक्त)।

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

+0

यह एक अच्छा सुझाव है, धन्यवाद! –

1

यह महंगा नहीं है। यह लॉगिंग उद्देश्यों के लिए एक सम्मेलन प्रतीत होता है।

logger.entering(CLASS_NAME, ...) 

तुलना

logger.entering(MyClass.class.getName() ,...) 

उस के अलावा करने के लिए, नहीं तोड़ सकता है (गलत वर्ग प्रवेश करने) जब एक अन्य स्रोत को कॉपी किया कोड प्रवेश करने।

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