伙计我在我的小型java实用程序中打印了很多日志,所以只想到这个问题,如果它的系统和效率非常重要,如果我们生成了很多日志(使用log4j)这是更好的对象保存日志消息 String或StringBuilder。
答案 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安全转换为字符串以进行替换。