Что является более эффективным для печати журналов с помощью log4j String или StringBuilder - PullRequest
2 голосов
/ 21 октября 2011

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

Ответы [ 7 ]

5 голосов
/ 21 октября 2011

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

logger.Debug(string1 + string2);

и

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

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

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

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

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

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

4 голосов
/ 21 октября 2011

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

Какойэто значит: вы, может быть, слишком много регистрируетесь?

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

3 голосов
/ 21 октября 2011

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

2 голосов
/ 21 октября 2011

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

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

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

1 голос
/ 21 октября 2011

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

0 голосов
/ 21 октября 2011

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

0 голосов
/ 21 октября 2011

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

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

...