一尘不染

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

java

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

选项1:

logger.debug("some debug text");

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

选项2:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text");
}

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

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

  1. 如果将值分配给debugEnabled变量,则
  2. 实际是由logger.debug()方法调用的。

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


阅读 201

收藏
2020-03-23

共1个答案

一尘不染

在这种特定情况下,选项1更好。

isDebugEnabled()当涉及到调用toString()各种对象的方法并连接结果时,保护语句(检查)可以防止对日志消息进行潜在的昂贵计算。

在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查是否启用记录器一样有效,并且由于分支较少,因此降低了代码的复杂性。

更好的方法是使用最新的日志记录框架,在该框架中,日志语句采用格式规范和由记录器替换的参数列表,但只有在启用记录器后才“懒惰”。这是slf4j采取的方法。

2020-03-23