2013-02-03 52 views
0

我打算增加一個調試標誌,每Log.d呼叫是否使用推薦的if(調試)語句?

public static final boolean DEBUG = FALSE; 
if (DEBUG) 
{ 
    Log.d(TAG,"Debug"); //dead code 
} 

會死人的代碼將在編譯時被刪除前加入if statement,或者將if statement是怎麼回事,每次被稱爲?

+0

你可能會考慮使用高級日誌記錄庫;或使用ProGuard從字節碼中刪除「Log」調用。看到類似的問題:http://stackoverflow.com/questions/2446248/remove-all-debug-logging-calls-before-publishing-are-there-tools-to-do-this – user46874

+0

@ user46874:proguard似乎是有用的,我會試一試,謝謝。 – meh

回答

1

您的調試代碼將始終執行(總是if)。 順便說一下,Android已經有這種類型的標誌:BuildConfig.DEBUG

+0

性能問題?如果我有大約300-400個日誌通話,他們是否顯而易見?或者我應該只是註釋掉/刪除日誌? – meh

+0

如果使用BuildConfig.DEBUg標誌,我甚至會認爲它會被編譯器優化。這是因爲If語句中的代碼塊永遠不會被執行。 – RvdK

1

不,這增加了代碼的詳細程度,只需使用一個日誌庫用於此目的,就像Log4J例如...

logger.debug("Here is some DEBUG"); 

在Android中,你可以使用android-logging-log4j ...

+0

我在說android,我會去掉Java標籤,只是爲了混淆。 – meh

+0

在Android中你可以使用android-logging-log4j,看看更新後的答案... – aleroot

+0

或者使用['logback-android'](http://tony19.github.com/logback-android) – user46874

1

它不會完全移除,但由於CPU的分支預測,下一次沒有性能影響。

理想情況下,您應該使用記錄器的日誌記錄級別來確定是否應該調用記錄器。

注:像這樣一個簡單的方法調用旁邊沒有開銷,你是否檢查或沒有(和庫應該檢查),你在哪裏得到性能上的優勢是,如果你正在做的事情在日誌消息像

在這種情況下,只有在調試啓用時纔會顯示調試消息,但是每次都會構建字符串消息,這意味着更高效。

if(LOGGER.isDebugEnabled()) 
    LOGGER.debug("The map is " + map);