2010-01-10 17 views
5

मैं एक सिफारिश यह वाक्य विन्यास का उपयोग करने के लिए मिल गया है जब जावा में प्रवेश करने से बचने के लिए:sorrounding लॉगर अनावश्यक स्ट्रिंग निर्माण

if (logger.isLoggable(Log.FINE)) 
{ 
    logger.fine("bla"+" bla"+" bla"); 
} 

इस का कारण यह पैरामीटर स्ट्रिंग बैठाना की अनावश्यक निर्माण से बचने के लिए है लॉगिंग स्तर "ठीक" से कम है। (उपर्युक्त उदाहरण में - 5 अनावश्यक स्ट्रिंग ऑब्जेक्ट। ("ब्लै" एक्स 3, "ब्लै ब्लै" और "ब्लै ब्लै ब्लै")

मैं यह सुनना चाहता हूं कि अन्य इस बारे में क्या कर रहे हैं या यदि आपको लगता है कि इस सब पर आवश्यक है।

धन्यवाद !!

+0

चूंकि यह सख्ती से राय का विषय है, इसे "समुदाय विकी" चिह्नित किया जाना चाहिए। –

+2

मैं असहमत हूं। मुझे लगता है कि इस पर विचार-विमर्श किया जा सकता है। –

+0

कारण मुझे नहीं लगता कि यह एक समुदाय विकी है कि मैं वास्तव में इस मुद्दे का सबसे अच्छा समाधान ढूंढ रहा हूं। एक बार मुझे "सर्वश्रेष्ठ समाधान" मिलेगा, मैं इसे उत्तर के रूप में चिह्नित करूंगा। – Ben

उत्तर

6

कुछ नए प्रवेश चौखटे आप पैरामीटर के रूप में तर्क निर्दिष्ट करने के लिए, और कोई प्रवेश हो, तो इनका मूल्यांकन नहीं होगा अनुमति देते हैं।

उदाहरण मैंने पाया LogBack है , Log4j के उत्तराधिकारी। यहां जानकारी है: http://www.infoq.com/news/2007/08/logback

यह आपको बोलने के लिए दोनों दुनिया के सर्वश्रेष्ठ प्रदान करता है। सुरुचिपूर्ण वाक्यविन्यास अभी तक अच्छा प्रदर्शन।


log4j कोड उदाहरण:

if(logger.isDebugEnabled()) { 
    logger.debug("User with account " + 
    user.getAccount() + " failed authentication; " + 
    "supplied crypted password " + user.crypt(password) + 
    " does not match."); 
} 

समतुल्य LogBack कोड:

logger.debug("User with account {} failed authentication; " + 
    "supplied crypted password {} does not match.", 
    user.getAccount(), user.crypt(password)); 

यह संदेश विधानसभा की लागत defers जब तक LOGBack का पता लगाया गया है या नहीं, इस संदेश को देखा जाएगा । यह महंगे पैरामीटर को पुनर्प्राप्त करने की लागत को रोकता नहीं है, जैसे उपर्युक्त उदाहरण में पासवर्ड क्रिप्टिंग।

+0

+1। निश्चित रूप से एक अच्छा समाधान। –

0

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

एक पक्ष नोट के रूप में: आप और भी अधिक प्रदर्शन को बचा सकता है, जहां इस सही मायने में इस जैसे एक निरंतर का उपयोग करके महत्वपूर्ण है:

public static final boolean DEBUG = false; 

अब आप एक अगर ब्लॉक जैसे में प्रवेश कोड लपेट हैं यह, JVM उत्पाद मोड में चलते समय डीबग कॉल को पूरी तरह ऑप्टिमाइज़ करने में सक्षम होगा। यह उतना करीब है जितना आप सी #ifdef पर जाते हैं।

if (Globals.DEBUG) { 
    // Logging call 
} 
0

डीबग प्रकार लॉगिंग के लिए बिल्कुल जरूरी है। यह स्ट्रिंग बनाने और इसे फेंकने से पहले लॉग स्तर की जांच करने के लिए 10x तेज की तरह कुछ है।

0

यह एक सुधार (अच्छा) है लेकिन इसे थोड़ा सुधार किया जा सकता है। एक ही समय में धारा में तुम भी प्रारूप संख्या कर सकते हैं -

एक वैश्विक config के रूप में इस्तेमाल वस्तु में एक प्रवेश स्तर (फाइन, आदि) के लिए अंतिम झंडे सेट करें, तो एक StringBuffer का उपयोग अपने डिबगिंग उत्पादन का निर्माण करने के।

public class MyAppConfig { 
    public final boolean FINE=true; 
    // ... other fields 
} 

public class MyApp { 
    void someFunction() { 
    ... 
    int imagesProcessed; 
    imagesProcessed = processImages(); 

    if (MyAppConfig.FINE) logger.fine(new StringBuffer(35). 
     append("Count of images processed: ").append(imagesProcessed).toString()); 

    ... 
    } 
} 

यहां स्ट्रिंग बफर 35 वर्णों की 'प्रारंभिक क्षमता' के साथ स्थापित किया गया है। यदि आप जानते हैं कि कितने पात्र उत्पन्न किए जा रहे हैं तो आप स्ट्रिंगबफर को संकेत प्रदान कर सकते हैं।

+1

यह ठीक है (कोई पन इरादा नहीं) समाधान यदि आप बिना किसी संकलन के लॉगिंग स्तर को बदलने का इरादा रखते हैं। अधिकांश लॉगिंग फ्रेमवर्क आपको इस गतिशील रूप से बदलने की अनुमति देते हैं, या कम से कम केवल एक कॉन्फ़िगरेशन फ़ाइल से पुनरारंभ करने की आवश्यकता होती है। उस स्थिति में, यह समाधान उस संभावना को हटा देता है। – Yishai

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