轉自:https://www.iteye.com/blog/zhukewen-java-1174017java
在項目中咱們常常能夠看到這樣的代碼:併發
if (logger.isDebugEnabled()) {性能
logger.debug(message);this
}debug
有些人不明白爲何要這樣寫。有些人認爲這樣是爲了可以控制日誌的輸出,對於下面這行代碼,日誌
logger.debug(message);blog
他們的見解是:若是這樣寫的話,就算你把日誌級別調整爲info, 這裏也會輸出日誌。開發
其實,在debug()方法裏面,就已經叛斷了日誌的級別。如下是isDebugEnabled()的源碼:get
public boolean isDebugEnabled() { 源碼
if(repository.isDisabled( Level.DEBUG_INT))
return false;
return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
如下是debug()的源碼:
public void debug(Object message) {
if(repository.isDisabled(Level.DEBUG_INT))
return;
if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(FQCN, Level.DEBUG, message, null);
}
}
咱們能夠看到,在debug()方法裏作了跟isDebugEnabled()方法同樣的判斷。
在這裏,咱們不由會想,那咱們凡是要輸日誌的地方,都不判斷isDebugEnabled,直接調debug方法,不更省事嗎?
官方的說法是:出於效率考慮,看具體狀況而定.
咱們來看下面一行代碼:
logger.debug("The money is " + getTotalMoney());
假設咱們的日誌級別設置爲info,那這句話不會輸出日誌,但這個方法仍是會調用。要調用這個方法,必須提供參數。getTotalMoney()方法返回的結果就是參數的一部分。假設getTotalMoney()要執行10秒鐘,10秒鐘後,進入到debug()方法裏,碰到了第一個判斷:
if(repository.isDisabled(Level.DEBUG_INT))
return;
在這裏就返回了。結果是日誌雖然沒有輸出,卻花費了10秒鐘來構造參數。很顯然這裏得不償失的。儘管實際應用中幾乎不可能有這種花10秒鐘來構造這樣一個參數的狀況,但若是併發數大的話,這樣寫仍是會影響系統的性能的。這個時候,就應該寫成:
if(logger.isDebugEnabled()){
logger.debug("The money is " + getTotalMoney());
}
若是debug的參數很簡單的話,也能夠直接寫 logger.debug(message)的。官方的說法,執行一次logger.isDebugEnabled()這樣的判斷花費的時間大概是寫日誌時間的萬分之一.雖然這個比例很小,
可是,程序中的任何地方放到併發的環境下,咱們就得從新考慮了。
因此,我以爲,咱們開發的時候, 應該視具體的狀況選擇不一樣的寫法。
第一次在這裏發文,雖然本身技術很菜,但醜媳婦總歸是要見家娘,技術應是百花爭嗚,不該一家獨大,不然全世界就只能是那幾個大拿寫技術文章了。在這寫寫本身心得,交流交流技術, 引引玉,總歸是件有意義的事。