在记录器的情况下,它说对于每个记录器都有参数构造的隐藏成本。
例如:-
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
这会产生构建消息参数的成本,即将整数 i 和 entry[i] 都转换为字符串,并连接中间字符串,而不管消息是否会被记录。这种参数构造的成本可能相当高,并且取决于所涉及的参数的大小。
在 log 4j 站点上给出了避免参数构造成本的最佳方法是使用 Log4j 2 的格式化功能。例如,代替上面的写法:
logger.debug("Entry number: {} is {}", i, entry[i]);
此格式化功能内部发生的情况使这次花费的成本会更少。它不是像以前的案例那样创建字符串吗?请有人解释一下?
最佳答案
在第一个示例中,即使不需要也创建字符串。但是,如果需要,这可能是最有效的方法。顺便说一句,String.valueOf
是多余的。
如果关闭消息,第二个选项会更快。这避免了创建一个后来被丢弃的字符串,因为它可以在构建字符串之前检查是否启用了调试。注意:如果您确实需要 String,它可能会更慢,因为它必须解析消息格式。
两全其美,但最难的是
if(logger.isDebugEnabled())
logger.debug("Entry number: " + i + " is " + entry[i]);
在这种情况下,您进行检查,如果要记录,则获取最快的消息生成。
有一些日志记录框架可以避免创建任何字符串并且速度足够快,您不需要首先关闭调试,但这些框架使用起来并不简单,除非您需要更高的性能,否则我会避免使用它们。
关于java - log4j v2 格式化功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20639634/