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



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



пример из slf4j



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


вместо



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


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

650   5  

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

это гораздо более ремонтопригодный и расширяемый. Кроме того, это легко перевести.

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

/**
* <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);

Comments

    Ничего не найдено.