2011-12-06 16 views
6

जब मैं जावा का अध्ययन शुरू कर रहा था, तो मुझे जावा ईई एप्लिकेशन में System.out.println नहीं करने के लिए कहा जा रहा था। हालांकि मुझे वास्तव में नहीं पता कि ऐसा करने का क्या कारण है।जावा ईई अनुप्रयोग में System.out.println खतरे

मुझे पूरी तरह से पता है कि अगर हमें वास्तव में एक महत्वपूर्ण प्रिंट करने की आवश्यकता है, तो इसे लॉगिंग फ्रेमवर्क का उपयोग करके लॉग किया जाना चाहिए।

क्या मैं सच में यहाँ पूछना चाहता हूँ: क्या कोई वास्तविक खतरा कि System.out.println कर रहा है? क्या यह किसी भी प्रदर्शन मुद्दे का कारण बनता है?

उत्तर

7

यह वास्तव में एक प्रदर्शन मुद्दा है। यदि आप System.out के लिए जेडीके स्रोत कोड में खोदते हैं तो आपको अंततः आउटपुट स्ट्रीम पर synchronized ब्लॉक का सामना करना पड़ेगा।

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

यहां कुछ आंकड़े शामिल हैं, प्रिंटल करने के लिए एक ही कॉल आम तौर पर आपके पूरे एप्लिकेशन को क्रॉल पर नहीं लाएगा। आपके कोड में अधिक प्रिंटल कॉल, अधिक संभावना दो या दो से अधिक धागे को एक दूसरे के लिए इंतजार करना होगा।

3

किसी भी जावा ईई अनुप्रयोग के भीतर, संभवतः एक ही जेवीएम के भीतर कई अनुप्रयोग चल रहे हैं। केवल एक System.out है। यदि कई एप्लिकेशन एक ही समय में System.out पर लिखने की कोशिश कर रहे हैं, तो यह आउटपुट पर विवाद पैदा कर सकता है, और सैद्धांतिक रूप से प्रदर्शन को प्रभावित कर सकता है।

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

जैसा कि आपने बताया है, उचित लॉगिंग ढांचे का उपयोग करके इन दोनों मुद्दों को खत्म कर दिया जाएगा।

0

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

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