如何减少logger.isDebugEnabled()的使用 - java

在这里,我将为logger.debug()添加logger.isDebugEnabled()条件语句。
但是有时有很多logger.debug()循环。例如:

Logger log = Logger.getLogger(Test.class);

for(int i = 0; i < 1000; i++) {
    ...
    log.debug("aaaaa");
    ...
    for(int j = 0; i < 100; j++) {
        ...
        log.debug("bbbb");
    }
}

如果我直接添加它,如下所示:

for(int i = 0; i < 1000; i++) {
    ...
    if(log.isDebugEnabled()) {
        log.debug("aaaaa");
    }
    ...
    for(int j = 0; i < 100; j++) {
        ...
        if(log.isDebugEnabled()) {
            log.debug("bbbb");
         }
    }
}

因此,在循环中,它将多次if()。如果(logger.isDebugEnabled())我怎么用呢?
有人知道吗?
谢谢。

java大神给出的解决方案

我在乎的是,if()循环是否会影响性能?

考虑以下代码:

    boolean logging = log.isDebugEnabled();

    for (int i = 0; i < 1000; i++) {
        // stuff
        if (logging) { 
            log.debug("Hi Mum!");
        }
        // more stuff
    }

if测试的成本可能只有2条指令,这取决于JIT编译器的寄存器分配如何完成。除非您进行大量的日志记录,否则这很可能无关紧要。

但是,如果这2到4条指令对性能的影响确实很重要,那么您可以考虑:

完全删除对log的呼叫,
使它以编译时间常数为条件(以便优化程序可以修剪代码),或者
使测试脱离循环;例如重组代码如下:

boolean logging = log.isDebugEnabled();

if (logging) {
    for (int i = 0; i < 1000; i++) {
        // stuff
        log.debug("Hi Mum!");
        // more stuff
    }
} else {
    for (int i = 0; i < 1000; i++) {
        // stuff
        // more stuff
    }
} 

但是,IMO认为,治愈方法要比疾病要差。

@Vineet的观点也很重要。在实践中,类似这样的昂贵部分:

log.debug("Today is " + date);

是无论实际的日志记录级别如何,都将评估String串联表达式。除了if测试之外,还有其他方法可以避免这种开销……尽管它们比对缓存标志的if测试要昂贵。

如何在Java中以语言环境正确的顺序格式化日期和月份? - java

有没有一种方法可以用Java / Kotlin中的区域设置正确的格式格式化日和月(以紧凑格式)而不格式化年份?因此,对于英语,应为“ 9月20日”,而对于瑞典语为“ 9月20日”。为了进行比较,在Cocoa平台上,我可以执行以下操作(在Swift中):let formatter = DateFormatter() formatter.locale = Loc…

如何修改休眠的SQL查询? - java

我有点好奇,有没有办法修改hibernate的核心,以便我可以自定义生成的SQL query。例如,在生成的查询中添加功能以使用connect by prior(oracle)或我要自定义的任何其他子句。 java大神给出的解决方案 起初,这样的问题总是在我心中敲响警钟。你被警告了...AFAIK,hibernate使用所谓的dialects进行特定的优化。…

用Java构建大批量数据处理工具 - java

Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。 3年前关闭。 Improve this question 我正在尝试使用Java构建ETL工具。 ETL工具用于对大量数据(关系型和其他类型)进行批量读取,…

用Java封装对象? - java

private中的Java提供类级别的封装。可以封装一个对象吗?还是这样做徒劳?例如,如果我们将一个类定义为 public class Person { private String ssn; private ArrayList<Person> friends = new ArrayList<Person>(); public voi…

使用TDD和Java开发的开源项目 - java

Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以使为on-topic。 5年前关闭。 Improve this question 我正在寻找一个项目:1)包括测试在内的可用资源。2)已/已严格使用TDD开发。3)用Java和JUnit…