在log4j中,在记录之前检查isDebugEnabled是否可以提高性能?

我在应用程序中使用Log4J进行日志记录。以前我使用像下面这样的调试调用:


选项1:


logger.debug("some debug text");

但有些链接建议最好先检查一下isDebugEnabled(),例如:


选项2:


boolean debugEnabled = logger.isDebugEnabled();

if (debugEnabled) {

    logger.debug("some debug text");

}

所以我的问题是“ 选项2是否会以任何方式提高性能? ”。


因为在任何情况下,Log4J框架都对debugEnabled进行相同的检查。对于选项2,如果我们在单个方法或类中使用多个调试语句,则框架可能不需要isDebugEnabled()(在每次调用中)多次调用方法,这可能是有益的。在这种情况下,它isDebugEnabled()仅调用一次方法,并且如果Log4J配置为调试级别,则实际上它isDebugEnabled()两次调用方法:


如果将值分配给debugEnabled变量,则

实际是由logger.debug()方法调用的。

我不认为如果我们logger.debug()在方法或类中编写多个语句,debug()然后根据选项1 调用方法,那么与选项2相比,它对Log4J框架来说是开销。因为这isDebugEnabled()是一个非常小的方法(就代码而言),因此成为内联的好人选。


慕勒3428872
浏览 425回答 3
3回答

慕莱坞森

在这种情况下,选项1更好。isDebugEnabled()当它涉及调用toString()各种对象的方法并连接结果时,可以使用保护语句(检查)来防止对日志消息进行潜在的昂贵计算。在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查是否启用记录器一样有效,并且由于分支较少,因此降低了代码的复杂性。更好的方法是使用最新的日志记录框架,在该框架中,日志语句采用格式规范和由记录器替换的参数列表,但只有在启用记录器后才“懒惰”。这是slf4j采取的方法。有关更多信息,请参见我对相关问题的答案,以及使用log4j进行此类操作的示例。

www说

由于在选项1中消息字符串是一个常量,因此用条件包装换行记录语句绝对没有收益,相反,如果启用了调试语句,则将进行两次评估,一次在isDebugEnabled()方法中,一次在系统中。debug()方法。调用的成本isDebugEnabled()约为5到30纳秒,对于大多数实际目的而言应该可以忽略不计。因此,选项2是不理想的,因为它会污染您的代码,并且不会带来其他收益。

慕工程0101907

isDebugEnabled()通过串联字符串来构建日志消息时,保留使用:Var myVar = new MyVar();log.debug("My var is " + myVar + ", value:" + myVar.someCall());但是,在您的示例中,您仅记录一个String而不执行诸如串联之类的操作就不会提高速度。因此,您只是在代码中添加了膨胀,使其难以阅读。我亲自在String类中使用Java 1.5格式调用,如下所示:Var myVar = new MyVar();log.debug(String.format("My var is '%s', value: '%s'", myVar, myVar.someCall()));我怀疑是否有很多优化,但是更容易阅读。请注意,尽管大多数日志记录API都提供了开箱即用的格式:例如slf4j提供了以下内容:logger.debug("My var is {}", myVar);甚至更容易阅读。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java