字符串连接的性能如何?

时间:2016-06-14 23:57:24

标签: java android performance micro-optimization

以下情况:我有很多日志语句,只有在调试模式下才能被执行。

我有两个如何实现这个的选项:

A

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避免字符串连接。

是否值得为性能提升编写额外的样板代码? 或者这些是否相等(例如,由于编译器优化)?

4 个答案:

答案 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)