Looking for java Keywords? Try Ask4Keywords

Java Language Pitfall - накладные расходы на создание сообщений журнала


пример

Уровни журналов TRACE и DEBUG позволяют передавать подробные сведения о работе данного кода во время выполнения. Обычно рекомендуется устанавливать уровень журнала выше этих, однако необходимо соблюдать осторожность, чтобы эти утверждения не влияли на производительность даже при кажущемся «выключенном».

Рассмотрим этот оператор журнала:

// Processing a request of some kind, logging the parameters
LOG.debug("Request coming from " + myInetAddress.toString() 
          + " parameters: " + Arrays.toString(veryLongParamArray));

Даже если для уровня журнала задано значение INFO , аргументы, переданные в debug() будут оцениваться при каждом выполнении строки. Это делает его излишне потребляющим по нескольким причинам:

  • String конкатенация: несколько String экземпляров будут созданы
  • InetAddress может даже выполнять поиск DNS.
  • veryLongParamArray может быть очень длинным - создание String из него потребляет память, требует времени

Решение

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

// No toString() evaluation, no string concatenation if debug is disabled
LOG.debug("Request coming from {} parameters: {}", myInetAddress, parameters));

Это работает очень хорошо, если все параметры могут быть преобразованы в строки с помощью String.valueOf (Object) . Если перевод сообщений журнала более сложный, уровень регистрации можно проверить перед протоколированием:

if (LOG.isDebugEnabled()) {
    // Argument expression evaluated only when DEBUG is enabled
    LOG.debug("Request coming from {}, parameters: {}", myInetAddress,
              Arrays.toString(veryLongParamArray);
}

Здесь LOG.debug() с дорогостоящим Arrays.toString(Obect[]) обрабатывается только тогда, когда DEBUG фактически включен.