与格式{}而不是字符串连接的记录仪SLF4J优势与格式{}而不是字符串连接的记录仪SLF4J优势(L

2019-05-14 00:33发布

有没有使用任何优势{}而不是字符串连接?

从SLF4J一个例子

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

代替

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

我认为这是关于速度优化,因为参数评测(和字符串连接)可在运行时根据配置文件来避免。 但是,只有两个参数是可能的,那么有时候没有其他选择,而不是字符串连接。 需要对这个问题的看法。

Answer 1:

关于字符串连接性能。 如果您有密集的日志记录语句这可能显著。

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

因为绝大多数的日志语句的有2个或更少的参数,所以SLF4J API的最高版本为1.6套(只),大部分使用情况。 因为API 1.7版本的API设计师们提供了可变参数参数的重载方法。

对于那些需要超过2个和你坚持前1.7 SLF4J,那么就请使用字符串连接或案件new Object[] { param1, param2, param3, ... } 应该有足够少的人的表现并不那么重要。



Answer 2:

短版:是的,它是速度更快,用更少的代码!

字符串连接做了很多工作,而无需如果需要,或明知不可(传统的“正在调试启用”从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公布的基准前阵子在列表中的一个。



Answer 3:

由于String是在Java中不变的 ,所以左边和右边的字符串必须复制到每对串联的新的String。 所以,最好去占位符。



Answer 4:

另一种选择是String.format() 我们在使用它jcabi日志 (约SLF4J静态实用的包装)。

Logger.debug(this, "some variable = %s", value);

这是更容易维护和扩展。 此外,它容易翻译。



Answer 5:

我认为,从笔者的角度来看,主要的原因是为了减少开销字符串concatenation.I刚读记录仪的文档,你会发现下面的话:

/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before 
  invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
 * @param format    the format string
 * @param arguments a list of 3 or more arguments
 */
public void debug(String format, Object... arguments);


文章来源: Logger slf4j advantages of formatting with {} instead of string concatenation