Зачем использовать дополнительное условие 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(), конкатенация строк не выполняется.
Это единственное преимущество.