Logger slf4j使用{}而不是字符串连接格式化的优点

Her*_*che 86 optimization logging concatenation string-formatting slf4j

使用{}而不是字符串连接有什么好处吗?

来自slf4j的一个例子

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
Run Code Online (Sandbox Code Playgroud)

代替

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Run Code Online (Sandbox Code Playgroud)

我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数评估(和字符串连接).但是只有两个参数是可能的,那么有时除了字符串连接之外别无选择.需要就此问题提出意见.

ska*_*man 66

关于字符串连接性能的.如果您拥有密集的日志记录语句,那么这可能很重要.

(在SLF4J 1.7之前)但是只有两个参数是可能的

由于绝大多数日志记录语句都有2个或更少的参数,因此最高版本1.6的SLF4J API涵盖(仅)大多数用例.自API版本1.7以来,API设计者已经为重载方法提供了varargs参数.

对于那些你需要超过2并且你仍然坚持使用1.7之前的SLF4J的情况,那么只需使用字符串连接或new Object[] { param1, param2, param3, ... }.它们应该足够少,表现不那么重要.

  • 应避免使用未使用的字符串连接(即调试语句).请使用(过于冗长但高效)的日志级别检查或(更轻薄但可能是次要开销)对象数组参数.(我更喜欢后者,所有条件都相同.)很难说字符串concat不重要/不会影响性能.理论上,对象数组的创建可以内联和优化,并且"真的"没有区别(与一厢情愿的想法相比).(这不是过早优化,只是在第一次做正确/更好的事情.) (2认同)

Tho*_*sen 39

简短版本:是的,速度更快,代码更少!

字符串连接在不知道是否需要的情况下做了很多工作(传统的"已启用调试"测试从log4j中得知),如果可能的话应该避免,因为{}允许延迟toString()调用和字符串构造在确定事件是否需要捕获之后.通过使记录器格式为单个字符串,我认为代码变得更清晰.

您可以提供任意数量的参数.请注意,如果您使用旧版本的sljf4j并且您有两个以上的参数{},则必须使用该new Object[]{a,b,c,d}语法来传递数组.参见例如http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String,java.lang.Object []).

关于速度:Ceki在其中一个名单上发布了一段基准.

  • 注意:最新的javadoc显示了较新的var-arg语法`debug(String format,Object ... arguments)`.请参见http://slf4j.org/faq.html#logging_performance (5认同)

小智 6

因为,String 在Java中是不可变的,所以左右String必须被复制到每个串联的新String中.所以,最好选择占位符.

  • 如果只有一对,这是正确的,但通常是不正确的,因为编译器将连接转换为字符串构建器调用,从而导致代码速度更快,但不会进行那么多分配。 (3认同)