gpt4 book ai didi

java - 在 log4j 中,在记录之前检查 isDebugEnabled 是否会提高性能?

转载 作者:行者123 更新时间:2023-12-01 19:25:00 37 4
gpt4 key购买 nike

我在应用程序中使用 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()方法调用。

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

最佳答案

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

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

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

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

参见my answer to a related question了解更多信息,以及使用 log4j 执行类似操作的示例。

关于java - 在 log4j 中,在记录之前检查 isDebugEnabled 是否会提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59320813/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com