Есть ли правильный способ передачи аргументов в slf4j? - PullRequest
41 голосов
/ 18 августа 2011

Я использую 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);

Какой механизм регистрации трассировок предпочтителен.

Ответы [ 3 ]

49 голосов
/ 18 августа 2011

3 является лучшим.

3 и 2 генерируют одинаковый (или почти одинаковый) байт-код, но 3 легче набрать и короче, поэтому 3 лучше, чем 2.

Если трассировка не включена, 1 должен выполнить конкатенацию строк («Время, затраченное на хранение» + count + ....), что несколько дорого, в то время как 2 выполняет конкатенацию строк только при включенной трассировке, поэтому 3 лучшечем 1.

29 голосов
/ 19 августа 2011

3 лучше, за исключением того, что он не поддерживается в SLF4J 1.6.x.Для трех или более аргументов вам нужна вторая форма.Третья форма работает только с одним или двумя аргументами (но не с тремя и более).

Начиная с SLF4J 1.7, третья форма теперь поддерживается и для 3 или более аргументов.Java-компилятор тихо преобразует вызовы с 3 или более аргументами во вторую форму, передавая Object [] в метод печати.Это деталь реализации varargs в Java и позволяет SLF4J 1.7 быть на 100% совместимым с SLF4J 1.6.

7 голосов
/ 15 марта 2013

Третий вариант - лучший.

Фактически, 1-й случай - это конкатенация строк через StringBuilder.

2-й и 3-й случаи совпадаютИм нужно поместить целочисленные значения в Integer (или другой объект), а затем создать массив для их упаковки.

Простой тест на моей машине говорит, что третий вариант лучше примерно в 8 раз, если нетведение журнала выполнено (56 нс против 459 нс).

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);
    }
}
...