文字列プールに関するパフォーマンスベンチマークを試しています。ただし、結果は期待されていません。
3つの静的メソッドを作成しました
- Perform0()メソッド...毎回新しいオブジェクトを作成します
- Perform1()メソッド...文字列リテラル「テスト」
- Perform2()メソッド...文字列定数式 "Te" + "st"
私の期待は(1.最速-> 3.最遅)でした
- 文字列プーリングによる「テスト」
- 文字列プーリングのために"Te"+ "st"ですが、+演算子のために1より少し遅くなります
- 文字列プーリングがないため、新しい文字列(..)。
しかし、ベンチマークは、「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はここでいくつかの最適化を行っていますか?ありがとうございました。