我想关于字符串池一些业绩比较基准。 然而,没有预料的结果。
我做了3种静态方法
- perform0()方法...创建一个新的对象,每次
- perform1()方法...字符串文字“测试”
- perform2()方法...字符串常量表达式 “TE” + “ST”
我的期望是(1.最快的 - > 3.最慢)
- 因为串池的“测试”
- 因为+操作“TE” +,因为串池,但“ST”位低于1
- 新的String(..),因为没有字符串池的。
但是基准表明,“TE” +“ST”是略低的速度比“测试”。
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”的性能比“测试”更快? 是JVM做了一些优化,在这里? 谢谢。