講講你不知道的System.out.println
在開發或者調試bug的過程中,有些同學經常用到System.out.println語句,輸出到控制檯,用來查看數據是否正常。
開發或者調試完畢,很可能就忘記刪除,直接就發佈到生產中去了。
在一些對性能要求比較高的項目當中,忘記刪除的這些代碼,就成爲將爲需要清除優化的對象了。
System.out.println 這個語句 對性能有影響嗎? 答案是肯定的,下面用實例給大家驗證一下:
廢話不多說,上代碼:
public class Test01 {
public static void main(String[] args) {
long startTime1 = System.currentTimeMillis();
for (int i = 0; i <100000; i++) {
System.out.println("i="+i);
}
long endTime1 = System.currentTimeMillis();
System.out.println("使用System.out.print輸出語句的耗時爲:"+(endTime1-startTime1));
long startTime2 = System.currentTimeMillis();
for (int i = 0; i <100000; i++) {
}
long endTime2 = System.currentTimeMillis();
System.out.println("不使用System.out.print輸出語句的耗時爲:"+(endTime2-startTime2));
}
}
輸出結果:
從打印結果我們可以看到,循環10w次的打印時間需要耗時1619毫秒,沒有打印的循環幾乎等於0毫秒。
原理分析:
爲什麼System.out.println語句會這麼耗費性能呢?
我們看一下System.out.println語句的源碼就知道答案了。
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
從源碼可以看到,在一開始就使用synchronized同步鎖給鎖起來了,所以System.out.println是一個同步方法,在高併發的情況下,會嚴重影響性能。
總結:
在日常開發或者調試的過程中,儘量使用log4j2或者logback這些異步的方法,進行日誌的統一收集,少用甚至是禁止用System.out.println.
項目上線前也要進行全局掃描,防止有人誤提交帶有System.out.println的代碼。
最後擴展幾個知識點:
1.System.out.println會輸出到tomcat容器的catalina.out文件中嗎?
答:默認是不輸出到tomcat的日誌文件中的,但是如果想要輸出到tomcat的日誌文件中,可以修改tomcat的配置文件,
conf-web.xml中,把defult-value的值改爲1(默認不輸出的時候值爲0)。
2.System.out.println在error級別的日誌中,會輸出日誌嗎?
我測試的時候使用的是logback,在配置文件中把日誌級別設置爲error,控制檯是有輸出的。
3.System.out.println在IDEA中的快捷鍵符號是啥?
sout
本人技術很菜,能力有限,如有錯誤,望各位大佬多多包涵,爲我指正出來哈。
相關參考: