為什么說log用占位符比用字符串連接比較好


我看的是logback的源碼

如果在日志等級符合輸出條件的情況下,兩個是沒有什么大區別的。

但如果是在日志等級不符合輸出條件的情況下:

由於字符串拼接是作為一個方法參數的,意味着它進入logback的內部判斷的時候,就已經是拼接成功了。而在這一步的拼接成功,涉及到String是一個final變量的問題,這個拼接是耗時了,創建了String,但是進入判斷之后又完全沒什么用。

這兩種是有區別的:

log.info("a" + "b");    // 沒有影響,因為在編譯時已經是常量了,一共1個變量
log.info(a + "b"); // 有影響,a變量是1個,常量"b"是一個,拼接后的有事一個,一共三個變量。 

而如果是占位符的話,它直接在logback的內部判斷了日志等級是否足以輸出,不行就直接return了。

 

再有就是

isDebugEnabled()

這種方法如果要封裝,但是參數是需要邏輯處理的話,是沒有什么用處的,需要顯示聲明才行。

public void aa() {
        //
        cc("cc");  
        //
        if (log.isDebugEnabled()) {
            cc("cc");
        }
        //
        cc(bb());
        //
        if (log.isDebugEnabled()) {
            cc(bb());
        }
    }

    public String bb() {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            stringBuilder.append(i);
        }
        return String.valueOf(stringBuilder);
    }

    public void cc(String aa) {
        if (log.isDebugEnabled()) {
            log.debug(aa);
        }
    }

①和②,是沒有什么區別的,但是③和④就用區別了。

④不會進行StringBuilder的拼接,但是③會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM