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

Есть ли правильный способ передать аргументы в 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);

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

4b9b3361

Ответ 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);
    }
}