Есть ли правильный способ передать аргументы в slf4j?
Im использует slf4j для отслеживания информации. Мой код
private static final Logger log = LoggerFactory.getLogger(ObjectTest.class);
log.trace("Time taken to store " + count
+ " objects of size " + size + " is " + (time) + " msecs");
log.trace("Time taken to store {} objects of size {} is {} msecs",
new Object[] { count, size, time });
log.trace("Time taken to store {} objects of size {} is {} msecs",
count, size, time);
Каким будет предпочтительный механизм регистрации трасс.
Ответы
Ответ 1
3 является лучшим.
3 и 2 генерируют один и тот же (или почти одинаковый) байт-код, но 3 легче вводить и короче, поэтому 3 лучше, чем 2.
Если трассировка не включена, 1 необходимо выполнить конкатенацию строк ( "Время, затраченное на сохранение" + счет +...), что несколько дорого, а 2 - конкатенация строк, только если трассировка включена, поэтому 3 лучше, чем 1.
Ответ 2
3 лучше всего, за исключением того, что он не поддерживается в SLF4J 1.6.x. Для трех или более аргументов вам нужна вторая форма. Третья форма работает только с одним или двумя аргументами (но не с тремя или более).
Как и в случае SLF4J 1.7, третья форма теперь поддерживается для 3 или более аргументов. Компилятор java автоматически преобразует вызовы с 3 или более аргументами во вторую форму, передавая объект [] методу печати. Это деталь реализации varargs в Java и позволяет SLF4J 1.7 быть на 100% совместимой с SLF4J 1.6.
Ответ 3
Третий вариант - лучший.
Фактически 1-й случай представляет собой конкатенацию строк через StringBuilder.
Второй и третий случаи одинаковы.
Им нужно привязать целочисленные значения к Integer (или другому объекту), а затем создать массив для их упаковки.
Простой тест на моей машине говорит о том, что 3-й вариант лучше примерно в 8 раз, если не выполняется каротаж (56ns против 459ns).
public class LogTest {
private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
public static void main(String[] args) {
int size = 100_000_000;
long start = System.nanoTime();
for (int i = 0; i < size; i++) {
logger.trace("1 {} 2 {} 3 {}", i, i, i);
}
System.out.println((System.nanoTime() - start) / size);
start = System.nanoTime();
for (int i = 0; i < size; i++) {
logger.trace("1 " + i + " 2 " + i + " 3 " + i);
}
System.out.println((System.nanoTime() - start) / size);
}
}