我是 Java 新手。
起初,我在不同情况下测试 String
和 StringBuilder
的性能。
但是,我发现 javac
和 eclipse
编译的相同代码执行不同。
我了解到 String
连接实际上是使用 StringBuilder
但为什么在这种情况下性能有如此大的差异,而 String 比 StringBuilder 快 1.5 倍
。
这是我的测试代码:
public class StringTest {
public StringTest() {
boolean flag = true;
int code = 10001, type = 1;
long time = System.nanoTime();
for (int i = 0; i < 10000000; ++i) {
String msg = Long.toString(i * 1000000000);
stringHandler(code, type, flag, msg);
}
System.out.println("Took " + (System.nanoTime() - time) + " ns by String");
time = System.nanoTime();
for (int i = 0; i < 10000000; ++i) {
String msg = Long.toString(i * 1000000000);
stringBuilderHandler(code, type, flag, msg);
}
System.out.println("Took " + (System.nanoTime() - time) + " ns by StringBuilder");
}
public String stringBuilderHandler(int code, int type, boolean flag, String msg) {
StringBuilder sb = new StringBuilder();
sb.append("{\"bool\":").append(flag).append(",")
.append("\"code\":").append(code).append(",")
.append("\"type\":").append(type).append(msg).append("}");
return sb.toString();
}
public String stringHandler(int code, int type, boolean flag, String msg) {
String str = "{\"bool\":";
str += flag;
str += ",";
str += "\"code\":";
str += code;
str += ",";
str += "\"type\":";
str += type;
str += msg;
str += "}";
return str;
}
public static void main(String[] args) {
StringTest st = new StringTest();
}
}
使用 javac 1.8:
Took 1066623964 ns by String
Took 1540007855 ns by StringBuilder
使用 Eclipse:
Took 4282720864 ns by String
Took 1709934263 ns by StringBuilder
最佳答案
在您的 stringBuilderHandler
中存在一个巨大问题,那就是您在每次调用时都创建了一个新的 StringBuilder
实例,当您应该重用相同的实例来查看串联。在 stringHandler
中做类似的事情:重用相同的 String
变量,然后你会注意到不同之处。此外,您应该遵循适当的微基准测试规则,如下所示:How do I write a correct micro-benchmark in Java?或者使用像 Caliper 或 JMH 这样的微型基准测试框架。
关于java - 使用 javac 1.8 的字符串连接性能比 Eclipse 编译器更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30442980/