Что более эффективно для печати журналов с помощью log4j String или StringBuilder

#java #string #log4j #stringbuilder

#java #строка #log4j #stringbuilder

Вопрос:

Ребята, у меня много журналов, которые печатаются в моей небольшой утилите Java, поэтому я просто подумал об этом вопросе, если важна очень большая система и эффективность, и если у нас сгенерировано много журналов (с использованием log4j), какой объект лучше для хранения строки сообщений журнала или StringBuilder.

Комментарии:

1. Насколько эффективно? Вы ищете лучшую пропускную способность или более экономичное использование памяти?

Ответ №1:

Если ваш выбор между

 logger.Debug(string1   string2);
 

и

 logger.Debug(new StringBuilder(string1).append(string2).toString());
 

Тогда нет никакой разницы

Но если есть много проверок и конструкций, например logString = <something> , тогда лучше использовать a StringBuilder .

Обратите внимание, что самая большая проблема с эффективностью log4j связана с вычислением выражений без проверки уровня журнала. Вам всегда нужно

 if (logger.isDebug())
    logger.Debug(..));
 

Много циклов процессора было потрачено впустую на объединение строк и вычисление других выражений, результаты которых вскоре будут отброшены, поскольку logger настроен на более высокий уровень.

Ответ №2:

Если вы действительно регистрируете так много материала, я бы предположил, что объем материала, который вы выводите, скажем, в файл, имеет большее значение, чем выбранный вами объект в памяти.

То есть: возможно, вы слишком много регистрируете?

Тем не менее, добавление StringBuilder будет более эффективным, чем просто добавление строки, при условии, что вы продолжаете добавлять содержимое сообщения журнала, но я был бы очень удивлен, если бы это имело какое-либо заметное значение.

Ответ №3:

Зависит. Планируете ли вы манипулировать строками, например, объединять их вместе? Если это так, StringBuilder будет лучше. Если нет, String было бы лучше.

Ответ №4:

Большинство систем ведения журнала предоставляют какой-то механизм if для вставки параметров (например. log.Debug("foo = {}", getFooValue() ). Это предпочтительный и наиболее эффективный способ.

Некоторые люди предложат использовать stringbuilder, подобный этому: stringBuilder.append(foo).append(bar).toString() , однако это не более эффективно, чем "foo" "bar" .

Сейчас я не могу найти онлайн-источник для этого, но я помню, что если вы посмотрите на байт-код этих двух фрагментов кода, он будет идентичным.

Ответ №5:

Если вас беспокоит эффективность, ваши журналы должны быть минимально необходимыми. Журналы могут оказаться серьезной нагрузкой в вашей системе, если вы слишком много регистрируете. и когда вы делаете что-то слишком большое, разница в производительности между string и StringBuffer исчезнет.

Ответ №6:

Я бы подумал, что вы могли бы передать его как строку, которую вам лучше использовать, потому что вы сохраняете вызов toString на StringBuilder .

Однако, если вы действительно хотите повысить эффективность, вы можете рассмотреть возможность передачи чего-то вроде поставщика строк. Это позволит вам проверить уровень ведения журнала перед созданием сообщения журнала в тех случаях, когда это не просто строка.

Ответ №7:

Конкатинация строк может быть очень дорогой. StringBuilder позаботится о части этого. Однако гораздо лучшим подходом является использование String.format . Этот метод принимает строку шаблона и переменное количество аргументов, которые являются безопасными для null, преобразуются в строки для подстановки.