3 回答
TA贡献1810条经验 获得超4个赞
在这种情况下,选项1更好。
isDebugEnabled()当它涉及调用toString()各种对象的方法并连接结果时,可以使用保护语句(检查)来防止对日志消息进行潜在的昂贵计算。
在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查是否启用记录器一样有效,并且由于分支较少,因此降低了代码的复杂性。
更好的方法是使用最新的日志记录框架,在该框架中,日志语句采用格式规范和由记录器替换的参数列表,但只有在启用记录器后才“懒惰”。这是slf4j采取的方法。
有关更多信息,请参见我对相关问题的答案,以及使用log4j进行此类操作的示例。
TA贡献1775条经验 获得超8个赞
由于在选项1中消息字符串是一个常量,因此用条件包装换行记录语句绝对没有收益,相反,如果启用了调试语句,则将进行两次评估,一次在isDebugEnabled()
方法中,一次在系统中。debug()
方法。调用的成本isDebugEnabled()
约为5到30纳秒,对于大多数实际目的而言应该可以忽略不计。因此,选项2是不理想的,因为它会污染您的代码,并且不会带来其他收益。
TA贡献1887条经验 获得超5个赞
isDebugEnabled()通过串联字符串来构建日志消息时,保留使用:
Var myVar = new MyVar();
log.debug("My var is " + myVar + ", value:" + myVar.someCall());
但是,在您的示例中,您仅记录一个String而不执行诸如串联之类的操作就不会提高速度。因此,您只是在代码中添加了膨胀,使其难以阅读。
我亲自在String类中使用Java 1.5格式调用,如下所示:
Var myVar = new MyVar();
log.debug(String.format("My var is '%s', value: '%s'", myVar, myVar.someCall()));
我怀疑是否有很多优化,但是更容易阅读。
请注意,尽管大多数日志记录API都提供了开箱即用的格式:例如slf4j提供了以下内容:
logger.debug("My var is {}", myVar);
甚至更容易阅读。
添加回答
举报