我们正在使用SLF4J
根据团队最近的讨论
if(LOG.isDebugEnabled()){
LOG.debug("hello " + a + " world" + b);
}
优于
LOG.debug("hello {} world {}", a, b);
因为在后一种情况下,即使未启用“debug”,也会创建字符串hello {} world {}
。换句话说,即使不需要,我们也总是创建字符串。
我喜欢后一版本,因为它显着提高了可读性。
有人可以提供意见吗?
此致
Shardul。
修改
让我说的不同。
哪种方法更好?或者哪种方法最受欢迎?
Shardul。
答案 0 :(得分:15)
不,较短的版本不会创建“hello {} world {}
”字符串。在编译和类加载期间,该字符串已创建并放置在常量池中。您始终从常量池引用相同的实例,它与引用常量int
一样便宜。
但是由于您使用字符串连接,因此在第一种形式中创建了字符串 。
唯一的额外开销是使用三个参数调用LOG.debug
,这些参数在内部调用isDebugEnabled()
时不执行任何操作。也有机会内联。
话虽如此,我会在99%的情况下选择较短的形式。我明确调用isDebugEnabled
的唯一情况是,计算要记录的消息的成本很高:
if(LOG.isDebugEnabled()){
LOG.debug("hello {} world {}", cheap, veryExpensive());
}
如果veryExpensive()
是ekhem,非常昂贵,那么如果将它丢弃则避免调用它是明智的。 BTW veryExpensive()
不应该有任何side effects,很难想象长效,无副作用的方法......
答案 1 :(得分:1)
创建String
对性能的影响可以忽略不计。但是当SLF4J documentation指定“时......如果禁用日志语句,此表单不会产生参数构造的成本
“意味着甚至没有创建String。
经过一番考虑后,“人为开销”,即代码清晰度的重要性使我们决定支持第二个例子。
因此,调用(以及编写和阅读)isXEnabled
mehod也会产生开销。