对于记录器,它表示对于每个记录器都存在隐藏的参数构造成本。
例如: -
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
这会导致构造消息参数的成本,即将integer i和entry [i]都转换为String,并连接中间字符串,无论是否记录消息。参数构造的成本可能非常高,并且取决于所涉及的参数的大小。
在log 4j网站上给出了避免参数构造成本的最佳方法是使用Log4j 2的格式化功能。例如,而不是上面写:
logger.debug("Entry number: {} is {}", i, entry[i]);
在此格式化功能中发生的事情是这次花费的成本会更少。是不是像以前的情况那样创建字符串。请有人解释一下吗?
答案 0 :(得分:1)
在第一个示例中,即使不需要,也会创建String。但是,如果需要,这可能是最有效的方式。 BTW String.valueOf
是多余的。
如果关闭消息,第二个选项会更快。这样可以避免创建一个稍后被丢弃的String,因为它可以在构建String之前检查是否启用了调试。注意:如果你确实需要String,它可能会变慢,因为它必须解析消息格式。
两全其美,但最令人担忧的是
if(logger.isDebugEnabled())
logger.debug("Entry number: " + i + " is " + entry[i]);
在这种情况下,您进行检查,如果要记录,请获取最快的消息生成。
有一些日志框架可以避免创建任何字符串并且速度足够快,您不需要首先关闭调试,但这些框架使用起来并不简单,除非您需要更高的性能,否则我会避免使用它们。 / p>