Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization Logger slf4j使用{}格式而不是字符串连接的优点_Optimization_Logging_Concatenation_String Formatting_Slf4j - Fatal编程技术网

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

Optimization Logger slf4j使用{}格式而不是字符串连接的优点,optimization,logging,concatenation,string-formatting,slf4j,Optimization,Logging,Concatenation,String Formatting,Slf4j,使用{}代替字符串连接有什么好处吗 slf4j的一个例子 logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 而不是 logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT); 我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数计算(和字符串连接)。但只有两个参数是可能的,所以有时除了字符串连接之外别

使用
{}
代替字符串连接有什么好处吗

slf4j的一个例子

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

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数计算(和字符串连接)。但只有两个参数是可能的,所以有时除了字符串连接之外别无选择。需要对这个问题发表看法。

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

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

因为绝大多数日志记录语句都有2个或更少的参数,所以1.6版之前的SLF4J API(仅)涵盖了大多数用例。自API版本1.7以来,API设计人员提供了带有varargs参数的重载方法

对于那些需要2个以上的对象,并且使用1.7SLF4J之前的版本的情况,只需使用字符串连接或
newobject[]{param1,param2,param3,…}
。它们应该足够少,以至于性能没有那么重要。

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

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

因为绝大多数日志记录语句都有2个或更少的参数,所以1.6版之前的SLF4J API(仅)涵盖了大多数用例。自API版本1.7以来,API设计人员提供了带有varargs参数的重载方法


对于那些需要2个以上的对象,并且使用1.7SLF4J之前的版本的情况,只需使用字符串连接或
newobject[]{param1,param2,param3,…}
。它们的数量应该足够少,以至于性能没有那么重要。

短版本:是的,它更快,代码更少

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

您可以提供任意数量的参数。请注意,如果您使用的是旧版本的sljf4j,并且
{}
有两个以上的参数,则必须使用
新对象[]{a,b,c,d}
语法来传递数组。见例


关于速度:Ceki不久前在其中一个列表上发布了一个基准

短版本:是的,它更快,代码更少

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

您可以提供任意数量的参数。请注意,如果您使用的是旧版本的sljf4j,并且
{}
有两个以上的参数,则必须使用
新对象[]{a,b,c,d}
语法来传递数组。见例


关于速度:Ceki不久前在其中一个列表上发布了一个基准

另一种选择是
String.format()
。我们在(slf4j周围的静态实用程序包装器)中使用它


它更易于维护和扩展。此外,它很容易翻译。

另一种选择是
String.format()
。我们在(slf4j周围的静态实用程序包装器)中使用它


它更易于维护和扩展。此外,它很容易翻译。

因为字符串在Java中是不可变的,所以每对串联都必须将左右字符串复制到新字符串中。因此,最好使用占位符。

因为,字符串在Java中是不可变的,所以对于每对串联,必须将左字符串和右字符串复制到新字符串中。因此,最好使用占位符。

我认为从作者的角度来看,主要原因是减少字符串连接的开销。我刚刚阅读了日志记录程序的文档,您可以找到以下文字:

/**
* <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);

我认为,从作者的角度来看,主要原因是减少字符串连接的开销。我刚刚阅读了日志记录程序的文档,您可以找到以下文字:

/**
* <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);

应避免使用未使用的字符串连接(即调试语句)。请使用(过于详细但效率很高)日志级别检查或(较小但开销可能较小)对象数组参数。(我更喜欢后者,一切都一样。)很难说字符串concat不重要/不会影响性能。从理论上讲,对象数组的创建可以内联并优化,而且“真的”没有什么区别(与一厢情愿相比)。(这不是过早的优化,只是第一次做一些正确/更好的事情。)为什么不对System.out.println()进行重载修改,以类似于slf4j的记录器,从而避免字符串连接?应该避免未使用的字符串连接(即调试语句)。请使用(过于详细但效率很高)日志级别检查或(较小但开销可能较小)对象数组参数。(我更喜欢后者,一切都一样。)很难说字符串concat不重要/不会影响性能。从理论上讲,对象数组的创建可以内联并优化,而且“真的”没有什么区别(与一厢情愿相比)。(这不是过早的优化,只是做一些正确/更好的事情