Подтвердить что ты не робот

Logger slf4j преимущества форматирования с помощью {} вместо конкатенации строк

Есть ли преимущества использования {} вместо конкатенации строк?

Пример из slf4j

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

вместо

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

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

4b9b3361

Ответ 1

Речь идет о производительности конкатенации строк. Это потенциально важно, если у вас есть плотные записи протоколирования.

(До SLF4J 1.7) Но возможны только два параметра

Потому что подавляющее большинство операторов протоколирования имеют 2 или меньше параметров, поэтому API SLF4J до версии 1.6 охватывает (только) большинство случаев использования. Дизайнеры API предоставили перегруженные методы с параметрами varargs с API версии 1.7.

В тех случаях, когда вам нужно больше 2, и вы застряли с pre-1.7 SLF4J, просто используйте либо конкатенацию строк, либо new Object[] { param1, param2, param3, ... }. Их должно быть немного, что производительность не так важна.

Ответ 2

Короткая версия: да, это быстрее, с меньшим количеством кода!

Конкатенация строк выполняет большую работу, не зная, нужна ли она или нет (традиционный тест "отладка включена", известная из log4j), и его следует избегать, если это возможно, так как {} позволяет отложить вызов toString() и конструкцию строки после того, как было решено, нужно ли захватывать событие или нет. По моему мнению, если в формате логгера используется одна строка, код становится чище.

Вы можете предоставить любое количество аргументов. Обратите внимание, что если вы используете старую версию sljf4j и у вас есть более двух аргументов для {}, вы должны использовать синтаксис new Object[]{a,b,c,d} для передачи массива. Смотрите, например, http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []).

Что касается скорости: Ceki недавно опубликовал тест в одном из списков.

Ответ 3

Поскольку String является неизменным в Java, поэтому левая и правая строки должны быть скопированы в новую строку для каждой пары конкатенации. Итак, лучше перейти на заполнитель.

Ответ 4

Другой альтернативой является String.format(). Мы используем его в jcabi-log (статическая утилита оболочки вокруг slf4j).

Logger.debug(this, "some variable = %s", value);

Это гораздо удобнее и удобнее. Кроме того, его легко перевести.

Ответ 5

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

/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before 
  invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
 * @param format    the format string
 * @param arguments a list of 3 or more arguments
 */
public void debug(String format, Object... arguments);