Java编译器不自动优化字符串连接?

Sou*_*per 3 java optimization performance stringbuilder jsoup

以下Jsoup代码连接容器中所有元素的文本els:

for (Element el : els)
  entireText += el.text();          
Run Code Online (Sandbox Code Playgroud)

在一个包含~64个元素的容器中,每个元素包含~1KB(整个文本总共约为64KB),这个简单的循环在典型的低端Android手机上大约需要8秒.

这种缓慢的性能样的惊喜我,因为我的印象是,Java编译像替代表情下A + B + Cnew StringBuilder(A).append(B).append(C).toString().

那不是这样吗?

我错过了什么?

Mic*_*mlk 12

这种缓慢的性能令我感到惊讶,因为我的印象是Java编译器用新的StringBuilder(A).append(B).append(C).toString()替换A + B + C这样的表达式.

所以编译器创建代码:

for (Element el : els)
  entireText = new StringBuilder(entireText).append(el.text()).toString(); 
Run Code Online (Sandbox Code Playgroud)

您需要在循环外创建StringBuilder并手动附加到它.

  • @Souper:真的不行.您请求并构建一个`String`变量.编译器无法真正忽略该请求,并且*不*构建该对象.JVM*理论上可以检测到你从不使用`String`,除了构建一个新的并创建一个`StringBuilder`,但我怀疑任何JVM都做了那种优化. (4认同)