在 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() 方法两次:

  1. 如果为 debugEnabled 变量赋值,并且
  2. 实际上由 logger.debug() 方法调用。

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

原文由 Silent Warrior 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 652
2 个回答

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

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

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

更好的方法是使用更新的日志记录框架,其中日志语句采用格式规范和要由记录器替换的参数列表——但是“懒惰地”,仅当启用记录器时。这是 slf4j 所采用的方法。

有关更多信息,请参阅 我对相关问题的回答,以及使用 log4j 执行此类操作的示例。

原文由 erickson 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于在选项 1 中消息字符串是常量,因此用条件包装日志语句绝对没有任何好处,相反,如果日志语句启用调试,您将评估两次,一次在 isDebugEnabled() 方法和一次 debug() 方法。调用 isDebugEnabled() 的成本大约为 5 到 30 纳秒,这对于大多数实际用途来说应该可以忽略不计。因此,选项 2 是不可取的,因为它会污染您的代码并且不会提供其他好处。

原文由 Ceki 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题