以下情况:我有很多日志语句,只有在调试模式下才能被执行。
我有两个如何实现这个的选项:
public void log(String message){
if(debug) doLog(message);
}
和很多这样的陈述:
log(something.toString() + "somelogmessage");
public void log(message){
doLog(message);
}
和很多这样的陈述:
if(debug) log(something.toString() + "somelogmessage");
虽然A更好地读取并产生更少的代码,但如果debug为false,则B避免字符串连接。
是否值得为性能提升编写额外的样板代码? 或者这些是否相等(例如,由于编译器优化)?
答案 0 :(得分:3)
我的意思是技术上,选项B会稍微快一点,因为它并不是因为它在任何地方都没有条件,但对于像这样小的东西,我肯定会建议使用选项A.开销量太小了它可以忽略不计,并且不值得你必须在整个地方投入的条件的附加代码。
答案 1 :(得分:3)
正如其他人所提到的(并且你已经用你的标签承认),这是一种微观优化,在绝大多数情况下都可能无关紧要。但是如果你想避免连接而不弄乱你的代码,你可以添加一个接受两个参数的重载:
public void log(Object prefix, String message){
if(debug) doLog(prefix.toString() + message);
}
然后致电
log(something, "somelogmessage");
如果您的消息可以由多个值组成,则可以改为使用varargs:
public void log(String... values){
if(debug) doLog(String.join("", values));
}
虽然在这种情况下性能优势更值得怀疑。
答案 2 :(得分:0)
如果它是for循环或一些真正重的代码,我会使用调试检查。
如果它只是几个小组,我不会担心它。
答案 3 :(得分:0)
在检查调试级别后,您可以在日志实现中使用PrintStream format method来提高性能并避免多余的连接。
您还可以查看SLF4J。它有像myModels[[1]]
# Call:
# lm(formula = x, data = iris)
#
# Coefficients:
# (Intercept) Sepal.Width
# 6.5262 -0.2234
这样的方法来阻止连接。当你必须进行复杂的登录时,它也有debug(String format, Object... objs)
这非常有用。
一些串联不会是一个大问题,但您应该考虑在日志API中添加新方法或使用SLF4J进行一些实现(例如logback)