講講你不知道的System.out.println(淺談System.out.println對性能的影響)

講講你不知道的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

 

本人技術很菜,能力有限,如有錯誤,望各位大佬多多包涵,爲我指正出來哈。

 

相關參考:

https://mp.weixin.qq.com/s/Z8AsJ8cxl9dpLJbzHkx7VQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章