2012-05-11 13 views
44

के बजाय {} के साथ स्वरूपण के लॉगजर slf4j फायदे स्ट्रिंग concatenation के बजाय {} का उपयोग करने का कोई फायदा है?स्ट्रिंग concatenation

एक उदाहरण slf4j

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT); 

के बजाय

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

उत्तर

39

यह स्ट्रिंग concatenation प्रदर्शन के बारे में है। यदि आपके घने लॉगिंग स्टेटमेंट हैं तो यह संभावित रूप से महत्वपूर्ण है।

(पहले SLF4J 1.7) लेकिन केवल दो पैरामीटर संभव हो रहे हैं

क्योंकि प्रवेश बयान के विशाल बहुमत, 2 या इससे कम मानकों है तो संस्करण के लिए SLF4J एपीआई ऊपर 1.6 कवर (केवल) बहुमत उपयोग के मामलों का। एपीआई डिजाइनरों ने API संस्करण 1.7 के बाद से varargs पैरामीटर के साथ अधिभारित विधियां प्रदान की हैं।

उन मामलों के लिए जहां आपको 2 से अधिक की आवश्यकता है और आप प्री-1.7 एसएलएफ 4 जे के साथ फंस गए हैं, तो बस स्ट्रिंग कॉन्सटेनेशन या new Object[] { param1, param2, param3, ... } का उपयोग करें। उनमें से कुछ कम होना चाहिए कि प्रदर्शन उतना महत्वपूर्ण नहीं है।

+0

संदेह की पुष्टि हुई, धन्यवाद –

+2

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

+0

नोट: नवीनतम slf4j में, java5 var-args समर्थित हैं – michael

26

लघु संस्करण: हाँ यह तेज़ कोड के साथ तेज़ है!

स्ट्रिंग कॉन्सटेनेशन यह जानने के बिना बहुत काम करता है कि यह आवश्यक है या नहीं (पारंपरिक "डिबगिंग सक्षम है" परीक्षण लॉग 4j से ज्ञात है), और यदि संभव हो तो इससे बचा जाना चाहिए, क्योंकि {} toString में देरी की अनुमति देता है () कॉल और स्ट्रिंग निर्माण के बाद यह तय किया गया है कि घटना को कैप्चरिंग की आवश्यकता है या नहीं। लॉगर प्रारूप को एकल स्ट्रिंग करके कोड मेरी राय में क्लीनर बन जाता है।

आप किसी भी तर्क प्रदान कर सकते हैं। ध्यान दें कि यदि आप sljf4j के पुराने संस्करण का उपयोग करते हैं और आपके पास {} पर दो से अधिक तर्क हैं, तो आपको इसके बजाय सरणी पास करने के लिए new Object[]{a,b,c,d} वाक्यविन्यास का उपयोग करना होगा। उदाहरण देखें http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object[])

गति के बारे में: सेकी ने सूचियों में से एक पर कुछ समय पहले एक बेंचमार्क पोस्ट किया था।

+5

नोट: नवीनतम जावाडोक नए var-arg वाक्यविन्यास, 'डीबग (स्ट्रिंग प्रारूप, ऑब्जेक्ट ... तर्क) दिखाता है। Http://slf4j.org/faq.html#logging_performance – michael

+0

को कॉन्सटेनेशन प्रदर्शन के अलावा .toString() मूल्यांकन के उल्लेख के कारण अपवित्र देखें। यह कुछ ऐसा है जो लॉगर के अंदर होता है और लॉगर यह तय कर सकता है कि उस विधि को आमंत्रित करना आवश्यक है या नहीं। ऐसा नहीं होता है कि लॉगिंग स्तर बार पूरा नहीं हुआ है। –

3

एक और विकल्प String.format() है। हम इसे jcabi-log (slf4j के आस-पास स्थिर उपयोगिता रैपर) में उपयोग कर रहे हैं।

Logger.debug(this, "some variable = %s", value); 

यह अधिक रखरखाव और विस्तार योग्य है। इसके अलावा, अनुवाद करना आसान है।

+2

मुझे नहीं लगता कि यह अधिक रखरखाव योग्य है। यदि 'मान' परिवर्तन का प्रकार बदलता है, तो आपको वापस जाना होगा और लॉगिंग स्टेटमेंट भी बदलना होगा। कुछ ऐसा जो आईडीई आपकी मदद नहीं करेगा। लॉगर्स को डिबगिंग में सहायता करनी चाहिए और इसके रास्ते में नहीं आना चाहिए। :-) –

+3

@ChetanNarsude IntelliJ 2016 कम से कम मुझे बताता है कि प्रारूप स्ट्रिंग स्वरूपण तर्कों में फिट नहीं होती है। उदाहरण के लिए: 'String.format ("% d", "test")' इंटेलिजे चेतावनी का उत्पादन करता है 'तर्क प्रकार' स्ट्रिंग 'प्रारूप विनिर्देशक'% d'.' के प्रकार से मेल नहीं खाता है। हालांकि, मुझे यकीन नहीं है कि उपर्युक्त समाधान के साथ काम करते समय भी यह बुद्धिमान प्रतिक्रिया प्रदान करने में सक्षम होगा। – crush

+0

इसकी गति क्या है? –

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