当我浏览一些代码时,我注意到使用logger如下,
if(logger.isDebugEnabled())
logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)
但在某些代码中,我观察到了这样的情况.
logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)
当我查看log4j的源代码时,在debug()Logger本身的方法中 if(logger.isDebugEnabled())进行了检查.那为什么我们需要这种不必要的开销if(logger.isDebugEnabled())?
Gui*_*ume 42
当您传递的String logger.debug(...)花费时间进行评估时,它很有用,在这种情况下,如果未启用调试,则可以跳过此评估.
if(logger.isDebugEnabled()) {
logger.debug("The meaning of life is " + calculateMeaningOfLife());
}
Run Code Online (Sandbox Code Playgroud)
IMO这使得代码的可读性低得多,因此只有在性能显着提高时才能使用.
Evg*_*eev 12
isDebugEnabled通常用于避免不必要的字符串连接,例如此调用
logger.debug("Line number = " + n);
Run Code Online (Sandbox Code Playgroud)
首先调用Strings concatination然后调试debug()然后只有Logger检测到调试没有启用并且只是返回.这可能会显着影响应用性能.
在SLF4J中解决了这个问题,SLF4J已经格式化了这样的日志记录方法
public void debug(String format, Object arg);
Run Code Online (Sandbox Code Playgroud)
小智 5
Java 必须首先解析传递给调试方法的字符串参数,然后才能调用它。
logger.debug("Something.. var1=" + variable1 + " var2=" + variable2);
Run Code Online (Sandbox Code Playgroud)
上面的代码将导致创建多个 String 对象,因为每个 + 创建另一个 String,因此在调用该方法之前您将创建大约 5 个或更多对象。
大多数情况下不会启用调试,因此检查是否启用调试比始终解析参数更有效。
| 归档时间: |
|
| 查看次数: |
22331 次 |
| 最近记录: |