2013-05-28 113 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

還要注意,當你正在使用像apache commons這樣的日誌框架,您應該在嘗試記錄連接字符串之前檢查日誌級別是否已啓用。如果日誌級別只有INFO,調用Logger.debug(「x =」+ 5)會導致字符串連接(這很重),而您嘗試登錄的消息並未真正記錄。 –

回答

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。您仍然可以配置您的log4j,只需對appender配置稍作修改即可輸出到System.out.println。

+0

您能否給出一個System.out實現的同步塊的參考?謝謝! – Mingyu

+0

更新了我的答案。 – Rudy

1

維護日誌文件比較好,而不是system.out.println。如果你使用這個,只有devolopers可以在控制檯上看到。你看不到更多的消息。

但使用。如果你使用日誌記錄您可以將郵件保存到數據庫或文件,你不能用它爲未來....等

+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

強烈建議使用諸如SLF4J之類的日誌框架。通過這種配置方式,您可以基於環境執行這些日誌記錄語句。

例如 - 開發人員的DEBUG級別 - 生產WARN,所以只有在生產中記錄關鍵的iformation。

1

我相信你在這方面正在談論Java,並將說明針對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它的最糟糕的做法。嘗試實現日誌記錄的概念。 使用log4jlog4j2來維護系統的日誌。用於跟蹤或調試代碼。

2

確實輸出到控制檯,特別是輸出過多會降低應用程序的性能。這也是更好的編程風格,不會給用戶帶來只有你可以使用的信息。相反,您應該使用Java的內置機制來處理意外事件,例如異常和斷言機制。您也可以選擇將'verbose'選項作爲命令行參數。

2

如果在多線程環境(甚至是Web應用程序)中廣泛使用System.out.println,則會導致嚴重的性能問題。每個println調用都會獲得一個鎖,以便控制檯上顯示的消息不會與其他消息混淆。

另外在大多數情況下,控制檯的輸出被重定向到一個文件。所以會產生大量的同步IO操作,導致性能下降。

2

是的,對System.out.println()的調用必須最小化。這是因爲打印到控制檯是IO操作,IO需要花費相當長的時間才能完成。這就是爲什麼我們儘可能使用StringBuilder來連接我們想要在內存中打印的內容。將所有我們想要在內存中打印的所有內容合併後,您需要調用System.out.println()。

調用System.out.println()對內存沒有影響。