Зачем использовать дополнительное условие if для logger.debug()?

Возможный дубликат:
В log4j ли проверка isDebugEnabled перед протоколом повышения производительности?

Я видел людей, использующих log4j следующим образом:

if(logger.isDebugEnabled())
{
    logger.debug(" message ");
}

Однако я проверил документацию для API logger.debug и обнаружил, что он проверяет, включен ли debug, прежде чем записывать сообщение. В этом случае, в чем смысл писать лишние, если?

Не было бы точно так же писать

logger.debug(" message ");

?

Ответ 1

Если вы действительно просто пишете

logger.debug(" message ");

тогда нет никакой пользы. Но учтите:

logger.debug("This: " + message + " happened on thread " + thread +
            "because " + cause);

Вы не хотите, чтобы конкатенация строк (и более дорогостоящие конверсии, потенциально - думали о вещах, которые вы, возможно, захотите записать, но которые дорого конвертируются в строки), которые будут выполняться, если результат просто будет брошен прочь.

Если ведение журнала имеет существенное влияние на производительность в нормальном случае, это препятствует добавлению кода регистрации, который действительно может помочь вам в ситуациях, когда вы вдруг хотите включить диагностику.

Ответ 2

Я думаю, что идея здесь состоит в том, чтобы предотвратить любую оценку параметра - в вашем случае это просто, но, например, скажем, что это было больше похоже:

logger.debug("Foo" + bar() + " bar: " + foo());

Хорошо, это надуманно, но если debug не включен, вы можете не захотеть выполнить bar() и foo() и конкатенацию строк...

Ответ 3

Одна из причин может заключаться в том, что при создании сообщения возникают некоторые накладные расходы. Например:

if(debug.isDebugEnabled()) {
    String message = buildLogMessage()
    logger.debug(message);
}

Если buildLogMessage() требуется некоторое время для запуска, вы можете не захотеть запускать его, когда знаете, что вывод никогда не будет зарегистрирован.

Однако лучший способ решить эту проблему - использовать ObjectRender, чтобы преобразование в String выполнялось только при достижении значения для регистрации.

Ответ 4

Если вы займете немного времени, чтобы увидеть реализацию log4j, вы можете узнать, в чем причина. Когда вы пишете: logger.debug(" message "); Приложение log4j всегда добавляет loggingEvent. Это дорогостоящие преобразования. Условие if будет лучшим, но полезным в некоторых случаях.

// AppenderAttachableImpl.class
public int appendLoopOnAppenders(LoggingEvent event) {
        int size = 0;
        if (appenderList != null) {
            size = appenderList.size();
            for (int i = 0; i < size; i++) {
                Appender appender = (Appender) appenderList.elementAt(i);
                appender.doAppend(event);
            }

        }
        return size;
    }

Ответ 5

Другая причина - изменить поведение виртуальной машины HotSpot. Не совсем уверен, как это работает, но если вы работаете в режиме производства (отключение отладки отключено) - виртуальная машина HotSpot должна оптимизировать код, как если бы оператор if и все внутри не было.

Ответ 6

До вызова метода debug может быть выполнен код, который можно было бы избежать с помощью условного предложения, например, конкатенации строк. Пример:

log.debug("Value of variable1:"+variable+" Value of variable2:"+variable2);

Если вы добавите условие, если log.isDebugEnabled(), конкатенация строк не выполняется.

Это единственное преимущество.