我正在尝试一些关于字符串池的性能基准。然而,结果并不出人意料。
我做了3个静态方法
- perform0() 方法...每次都创建一个新对象
- perform1() 方法 ... 字符串文字“Test”
- perform2() 方法 ... 字符串常量表达式 "Te"+"st"
我的期望是(1. 最快 -> 3. 最慢)
- “测试”因为字符串池
- "Te"+"st" 因为字符串池,但由于 + 运算符而比 1 慢一点
- new String(..) 因为没有字符串池。
但基准测试显示“Te”+“st”比“Test”略快。
new String(): 141677000 ns
"Test" : 1148000 ns
"Te"+"st" : 1059000 ns
new String(): 141253000 ns
"Test" : 1177000 ns
"Te"+"st" : 1089000 ns
new String(): 142307000 ns
"Test" : 1878000 ns
"Te"+"st" : 1082000 ns
new String(): 142127000 ns
"Test" : 1155000 ns
"Te"+"st" : 1078000 ns
...
这是代码:
import java.util.concurrent.TimeUnit;
public class StringPoolPerformance {
public static long perform0() {
long start = System.nanoTime();
for (int i=0; i<1000000; i++) {
String str = new String("Test");
}
return System.nanoTime()-start;
}
public static long perform1() {
long start = System.nanoTime();
for (int i=0; i<1000000; i++) {
String str = "Test";
}
return System.nanoTime()-start;
}
public static long perform2() {
long start = System.nanoTime();
for (int i=0; i<1000000; i++) {
String str = "Te"+"st";
}
return System.nanoTime()-start;
}
public static void main(String[] args) {
long time0=0, time1=0, time2=0;
for (int i=0; i<100; i++) {
// result
time0 += perform0();
time1 += perform1();
time2 += perform2();
}
System.out.println("new String(): " + time0 + " ns");
System.out.println("\"Test\" : " + time1 + " ns");
System.out.println("\"Te\"+\"st\" : " + time2 + " ns");
}
}
有人可以解释为什么“Te”+“st”的性能比“Test”快吗?JVM在这里做了一些优化吗?谢谢你。