log.info используя log.isInfoEnabled - PullRequest
       5

log.info используя log.isInfoEnabled

5 голосов
/ 09 января 2012

Мы используем SLF4J

На основании недавнего обсуждения в команде

if(LOG.isDebugEnabled()){
  LOG.debug("hello " + a + " world" + b);
}

лучше

LOG.debug("hello {} world {}", a, b);

, потому что в последнем случае строка hello {} world {} создается, даже если «отладка» не включена. Другими словами, мы всегда создаем строки, даже если это не требуется.

Мне нравится последняя версия, поскольку она значительно улучшает читабельность.

Может ли кто-нибудь предоставить входные данные?

С уважением,

Shardul.

EDIT

Позвольте мне сказать это по-другому.

Какой подход лучше ИЛИ Какой подход наиболее широко принят?

Shardul.

Ответы [ 2 ]

15 голосов
/ 09 января 2012

Нет, более короткая версия не создает строку "hello {} world {}".Строка уже создана и помещена в пул констант во время компиляции и загрузки класса.Вы всегда ссылаетесь на один и тот же экземпляр из пула констант, это так же дешево, как и ссылка на константу int.

Но строка - это , созданная в первой форме, так как вы используете конкатенацию строк.

Единственные дополнительные издержки - это вызов LOG.debug с тремя аргументами, который ничего не делает, поскольку он вызывает isDebugEnabled() внутри.Также есть вероятность, что он будет встроен.

При этом я скажу, что в 99% случаев я пойду на более короткую форму.Единственная ситуация, в которой я бы явно назвал isDebugEnabled, - это когда вычисление сообщения для регистрации имеет значительную стоимость:

if(LOG.isDebugEnabled()){
  LOG.debug("hello {} world {}", cheap, veryExpensive());
}

Если veryExpensive(), ехем, очень дорого, то разумно избегатьназывая это, если это будет отброшено.КСТАТИ veryExpensive() не должно иметь никаких побочных эффектов , и трудно представить длительный, без побочных эффектов метод ...

1 голос
/ 09 января 2012

Влияние на производительность при создании String будет незначительным. Но, как документация SLF4J указывает "... эта форма не несет затрат на создание параметров в случае, если оператор журнала отключен « означает, что строка даже не создана.

После некоторого рассмотрения «человеческие накладные расходы», то есть важность ясности кода, заставили нас принять решение в пользу второго примера. Более того, при вызове (и написании и чтении) метода isXEnabled.

также возникают накладные расходы.
...