Использование средства форматирования с проверкой Logger v / s isXEnabled

Как известно

LOGGER.debug("The parameter p1 cannot be " + p1 +
        ", it must be between " + P1_MIN + " and " + P1_MAX);

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

if (LOGGER.isDebugEnabled())
{
    LOGGER.debug("The parameter p1 cannot be " + p1 +
            ", it must be between " + P1_MIN + " and " + P1_MAX);
}

Что позволяет избежать этого за счет трех дополнительных строк.

slf4j (и другие) предлагают альтернатива с использованием varargsoverloading):

    LOGGER.debug("The parameter p1 cannot be {} , it must be between {} and {}", 
             p1, P1_MIN, P1_MAX);

Это выглядит намного чище, но создается Object array для передачи переменного числа параметров.

Насколько дорого обходится создание этого массива объектов? Перевешивает ли его стоимость преимущества сокращения количества строк кода?

Я подозреваю, что методы, основанные на varargs/formatter, созданы именно для решения вышеуказанного шаблона, поэтому даже если несколько субъективные ответы экспертов помогут огромному количеству программистов. Кроме того, IMHO, это не субъективно, если создание массива объектов очень дешево (на что я надеюсь) или очень дорого.


person Miserable Variable    schedule 10.05.2012    source источник
comment
Речь идет не только о создании и заполнении Object[] Альтернатива slf4j также внутренне должна будет проанализировать строку формата, создать объект форматирования и построить отформатированную строку. Мне не ясно, почему вы ожидаете, что это будет дешевле, чем просто проверка, включена ли отладка в регистраторе.   -  person QuantumMechanic    schedule 10.05.2012
comment
@QuantumMechanic - хороший аргумент, но, допустим, мы игнорируем сравнительные затраты на создание форматированной выходной строки и их конкатенацию.   -  person Miserable Variable    schedule 10.05.2012
comment
@ KonstantinV.Salikhov по этому вопросу varargs очень дорого. Я правильно это читаю?   -  person Miserable Variable    schedule 10.05.2012
comment
@MiserableVariable по крайней мере в 2010 году - да. Насколько это сейчас дорого - не знаю.   -  person Konstantin V. Salikhov    schedule 10.05.2012
comment
SFL4J не использует vargs / Object []. Он предлагает перегруженные методы для 1 и 2 аргументов, а также перегруженный метод с Object [] в качестве последнего параметра для работы с 3 или более аргументами.   -  person Ceki    schedule 11.05.2012
comment
@Ceki ой ... спасибо. Я смотрел void debug(String format, Object[] argArray) и читал void debug(String format, Object... argArray).   -  person Miserable Variable    schedule 11.05.2012