使用log4j String或StringBuilder打印日志的效率更高

时间:2011-10-21 11:07:23

标签: java string log4j stringbuilder

伙计我在我的小型java实用程序中打印了很多日志,所以只想到这个问题,如果它的系统和效率非常重要,如果我们生成了很多日志(使用log4j)这是更好的对象保存日志消息 String或StringBuilder。

7 个答案:

答案 0 :(得分:5)

如果您的选择在

之间
logger.Debug(string1 + string2);

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

然后没有区别

但如果有很多检查和构造如logString += <something>那么使用StringBuilder会更好。

请注意,log4j的最大效率问题来自于在不检查日志级别的情况下计算表达式。您总是需要

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

许多CPU周期浪费了串联字符串并评估其结果将很快被丢弃的其他表达式,因为logger设置为更高级别。

答案 1 :(得分:4)

如果你真的记录了那么多东西,我会想象你输出的东西,比如一个文件,比你选择的内存对象更有意义。

这就是说:你可能记录得太多了?

也就是说,StringBuilder追加将比String追加更有效,假设你不断添加日志消息的内容,但如果它有任何显着的差异,我会感到非常惊讶。

答案 2 :(得分:3)

取决于。您是否计划操纵字符串,例如将它们连接在一起?如果是这样,StringBuilder会更好。如果没有,String会更好。

答案 3 :(得分:2)

大多数日志记录系统提供某种插入参数的机制(例如log.Debug("foo = {}", getFooValue())。这是首选且最有效的方式。

有些人会建议使用这样的字符串构建器:stringBuilder.append(foo).append(bar).toString(),但这并不比"foo" + "bar"更有效。

我现在找不到它的在线资源,但我记得如果你看一下这两个代码片段的字节码,它就会完全相同。

答案 4 :(得分:1)

如果您关心效率,那么您的日志应该是最低要求。日志可能被证明是系统中的主要开销,因为您记录的太多。当你做的事情太多时,字符串和stringBuffer之间的性能差异就会消失。

答案 5 :(得分:0)

我认为您可以将其作为字符串传递,因为您将toString上的StringBuilder号码保存为{{1}}。

但是,如果您真的想提高效率,可以考虑传递像String Supplier这样的东西。这将允许您在生成日志消息之前检查日志记录级别,这不是简单的String。

答案 6 :(得分:0)

字符串连接可能非常昂贵。 StringBuilder负责部分工作。然而,更好的方法是使用String.format。此方法采用模式String和可变数量的参数,这些参数为null安全转换为字符串以进行替换。