2013-05-28 10 views
13

मैं लिखने के लिए system.out.println() के साथ कोड विकसित करता था। यह आमतौर पर मुझे मूल्यों को ट्रैक करने में मदद करता है और समस्या कहां आ रही है। और विकसित अनुप्रयोग के बाद, मैं system.out.println() को नहीं हटाता क्योंकि उपयोगकर्ता को कोई समस्या मिलने के बाद यह सहायक हो सकता है, यह हमारे पास वापस आ जाएगा, जिससे यह पता चलाना आसान हो जाता है कि गलत कहां गया। लेकिन मेरे बेहतर में से एक को कोड से system.out.println() हटाने का सुझाव दिया गया है क्योंकि यह कोड कुशल स्तर पर प्रभाव डालता है। क्या ये सही है?क्या System.out.println() कोड दक्षता को प्रभावित करता है?

मेरे दृष्टिकोण से, System.out.print() शायद स्मृति पर बाइट्स लेते हैं, तो क्या यह सच है कि डेवलपर को system.out.println का उपयोग नहीं करना चाहिए ??

अग्रिम धन्यवाद।

+1

http://stackoverflow.com/questions/8601831/do-not-use-system-out-println-in-server-side-code देखें – devnull

+0

आप syso लाइनों के बजाय लकड़हारा का उपयोग करना चाहिए –

+1

यह भी ध्यान रखें कि जब आप अपाचे कॉमन्स जैसे लॉगिंग फ्रेमवर्क का उपयोग कर रहे हैं, आपको यह जांचना चाहिए कि लॉग स्तर को समेकित तारों को लॉग करने का प्रयास करने से पहले सक्षम किया गया है या नहीं। Logger.debug को कॉल करना ("x =" + 5) यदि लॉग स्तर केवल INFO एक स्ट्रिंग कॉन्सटेनेशन (जो भारी है) का कारण बनता है, जबकि जिस संदेश को आपने लॉग करने का प्रयास किया है वह वास्तव में लॉग नहीं होता है। –

उत्तर

16

System.out कार्यान्वयन में आउटपुट स्ट्रीम पर सिंक्रनाइज़ किया गया है।

PrintStream.java से

:

 /** 
     * Prints a String and then terminate the line. This method behaves as 
     * though it invokes <code>{@link #print(String)}</code> and then 
     * <code>{@link #println()}</code>. 
     * 
     * @param x The <code>String</code> to be printed. 
     */ 

     public void println(String x) { 
      synchronized (this) { 
       print(x); 
       newLine(); 
      } 
     } 

लाना System.out.println एक बहुत पूरी परियोजना कर देगा तुल्यकालन ताला के लिए इंतज़ार कर सभी धागा इच्छा क्योंकि, लगभग अकेले ही पिरोया चलाते हैं, और आपके आवेदन को क्रॉल करने के लिए शुरू करने के लिए ।

इसका मतलब है कि आपका श्रेष्ठ सही है।

वैकल्पिक रूप से, log4j जैसे लॉगिंग फ्रेमवर्क का उपयोग करें। आप अभी भी एपेंडर कॉन्फ़िगरेशन में मामूली परिवर्तनों से System.out.println पर आउटपुट करने के लिए अपने log4j को कॉन्फ़िगर कर सकते हैं।

+0

क्या आप System.out कार्यान्वयन के सिंक्रनाइज़ किए गए ब्लॉक का संदर्भ दे सकते हैं? धन्यवाद! – Mingyu

+0

ने मेरा जवाब अपडेट किया। – Rudy

1

system.out.println के बजाय लॉगिंग फ़ाइलों को बनाए रखना अच्छा है। यदि आप इस केवल devolopers का उपयोग कंसोल पर देख सकते हैं। आप इसके साथ और संदेश नहीं देख सकते हैं।

लेकिन आप भविष्य के लिए इसका इस्तेमाल नहीं कर सकते हैं use.If आप यदि आपको लॉग इन डेटाबेस या फाइलों में संदेशों को बचा सकता है का उपयोग करें .... आदि

+0

नहीं। आप सही हैं – PSR

3

आप समस्या को हल करने लकड़हारा उपयोग कर सकते हैं।

अपना कोड विकसित करते समय लॉगिंग का स्तर निर्दिष्ट करें, और आप उत्पादन में लॉगिंग का स्तर निर्धारित कर सकते हैं।

स्तरों की सूची:

DEBUG Level 

INFO Level 

WARN Level 

ERROR Level 

FATAL Level 

log4j आम से एक का उपयोग करने के लिए है, यहाँ देखें:

प्राथमिक कारण:

http://logging.apache.org/log4j/2.x/

विपक्ष println का उपयोग करने का के बारे में

इसके खिलाफ है कि println धीमा हो जाता है आपके कार्यक्रम की गति।

+0

धन्यवाद। हाँ मुझे पता है लेकिन इसके लिए मुझे एक लॉग फ़ाइल खोलनी है और देखना है। उदाहरण के लिए system.out.print() मानों को डीबग करते समय केवल मान मुद्रित करें। तो लॉग फ़ाइलों की तुलना में यह अधिक सुविधाजनक .. यदि मैं अधिक s.o.p का उपयोग करता हूं तो नुकसान क्या होता है? मेरा प्राथमिक उद्देश्य है? –

+0

println उत्पादन में आपके प्रोग्राम की गति को धीमा कर देता है – Mingyu

2

एसएलएफ 4 जे जैसे लॉगिंग फ्रेमवर्क का उपयोग अत्यधिक अनुशंसा की जाती है। कॉन्फ़िगरेशन द्वारा इस तरह, आप वातावरण के आधार पर इन लॉगिंग विवरणों को निष्पादित कर सकते हैं।

उदाहरण के लिए - डेवलपर पर DEBUG स्तर - उत्पादन पर WARN, इसलिए उत्पादन में केवल महत्वपूर्ण अपूर्णता लॉग है।

1

मुझे विश्वास है कि आप इस संदर्भ में जावा के बारे में बात कर रहे हैं और system.out.println() के खिलाफ एक और विधि को चित्रित करने जा रहे हैं।

System.out.print(); // Prints a string of characters only 
System.out.println(); // Prints a string of character followed by a line break and that line break is the one which is taking up tons of space if I ain't wrong. 

उम्मीद है कि इससे मदद मिलती है।

1

System.out.println डालने का यह सबसे खराब अभ्यास है। लॉगिंग अवधारणा को लागू करने का प्रयास करें। अपने सिस्टम के लॉग को मैप करने के लिए log4j या log4j2 का उपयोग करें। कोड का पता लगाने या डिबग करने के लिए।

2

यह सच है कि कंसोल को आउटपुट करना, विशेष रूप से अत्यधिक आउटपुट, एप्लिकेशन के प्रदर्शन को कम करेगा। यह भी बेहतर प्रोग्रामिंग शैली है कि उपयोगकर्ता को उस सूचना के साथ बोझ न दें जिसे आप केवल उपयोग कर सकते हैं। इसके बजाय, आपको अप्रत्याशित घटनाओं को संभालने के लिए जावा के अंतर्निर्मित तंत्र का उपयोग करना चाहिए, उदा। अपवाद और जोर तंत्र। आप कमांड लाइन तर्क के रूप में 'वर्बोज़' विकल्प भी चुन सकते हैं।

2

System.out.println गंभीर प्रदर्शन समस्याओं का कारण बन सकता है यदि बहु-थ्रेडेड वातावरण (यहां तक ​​कि वेबप्लिकेशंस) में बड़े पैमाने पर उपयोग किया जाता है। प्रत्येक println कॉल लॉक प्राप्त करता है ताकि कंसोल पर प्रदर्शित संदेश अन्य संदेशों के साथ मिश्रित न हो।

इसके अलावा अधिकांश मामलों में कंसोल का आउटपुट फ़ाइल पर रीडायरेक्ट किया जाता है। तो यह बहुत सारे सिंक्रोनस आईओ संचालन करता है जो प्रदर्शन में गिरावट का कारण बन सकता है।

2

हाँ यह सच है कि System.out.println() को कॉल कम किया जाना चाहिए। ऐसा इसलिए है क्योंकि कंसोल पर प्रिंटिंग एक आईओ ऑपरेशन है और आईओ को पूरा करने के लिए अपेक्षाकृत लंबा समय लगता है। यही कारण है कि हम जितना संभव हो, हम स्ट्रिंगबिल्डर का उपयोग उन सामानों को संयोजित करने के लिए करते हैं जिन्हें हम मेमोरी में मुद्रित करना चाहते हैं। स्मृति को मेमोरी में प्रिंट करना चाहते हैं, यह वह समय है जिसमें आप System.out.println() को कॉल करना चाहते हैं।

कॉलिंग System.out.println() को स्मृति पर कोई प्रभाव नहीं पड़ता है।

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