当前位置: 首页 > 面试题库 >

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

彭风华
2023-03-14
问题内容

我在应用程序中使用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()是一个非常小的方法(就代码而言),所以它可能成为内联的好人选。


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 当我浏览一些代码时,我注意到使用logger的方式如下, 但是在某些代码中,我是这样观察的。 当我查看log4j的源代码时,已检查了Logger本身的方法 。那为什么我们需要这些不必要的开销呢? 问题答案: 当传递给您的字符串花费时间评估时,这很有用,在这种情况下,如果未启用调试,则可以跳过此评估。 IMO使得代码的可读性大大降低,因此只有在性能有了显着提高时才应使用它。

  • 问题内容: 如果一个查询只有一个结果记录,将查询限制在一个结果记录中,会提高性能吗? 例如 如果只有一个记录具有该名称?如果主键/设置为唯一,那该怎么办?值得更新查询还是收益最小? 问题答案: 如果列有 唯一索引:不, 没有更快 非唯一索引:可能是 因为它会阻止发送除第一个匹配项之外的任何其他行(如果存在) 无索引:有时 如果有1个或更多行与查询匹配,则为 yes ,因为在匹配第一行后将停止全表扫

  • 问题内容: Kotlin是否可以提高性能?有基准测试吗?Kotlin比Java快吗?我在Kotlin网站上找到了这个。https://kotlinlang.org/docs/reference/comparison- to-java.html 谈论语言功能而不是性能。 问题答案: Kotlin生成的字节码与Java非常相似,因此Kotlin代码的性能在大多数情况下与等效Java代码的性能相同。 内

  • 问题内容: 我是Laravel的新手。请原谅新手问题,但是如何查找记录是否存在? 我在这里可以查看是否有记录? 问题答案: 这取决于您之后是否要与用户一起使用,还是仅检查是否存在。 如果要使用用户对象(如果存在): 如果您只想检查 甚至更好

  • 我是拉雷维尔的新手。请原谅这个新手的问题,但是我如何找到是否存在记录? 我可以在这里做什么来查看是否有记录?

  • 问题内容: 我必须每20秒阅读一次CSV。每个CSV都包含最小值。500至最大 60000行。我必须将数据插入Postgres表中,但是在此之前,我需要检查是否已插入项目,因为很有可能会获得重复的项目。检查唯一性的字段也已建立索引。 因此,我分块读取文件,并使用IN子句获取数据库中已有的项目。 有更好的方法吗? 问题答案: 这应该表现良好: 与这个答案密切相关。