これはJavaの一部のバージョンの機能だと思います。
私が以下を実行した場合
public class Main {
public static final int RUNS = 100000000;
static final ThreadLocal<StringBuilder> STRING_BUILDER_THREAD_LOCAL = new ThreadLocal<StringBuilder>() {
@Override
protected StringBuilder initialValue() {
return new StringBuilder();
}
};
public static final StringBuilder myStringBuilder() {
StringBuilder sb = STRING_BUILDER_THREAD_LOCAL.get();
sb.setLength(0);
return sb;
}
public static long testSeparate(String x, String y, String z) {
long start = System.nanoTime();
for (int i = 0; i < RUNS; i++) {
StringBuilder s = myStringBuilder();
s.append(x)
.append(y)
.append(z);
dontOptimiseAway = s.toString();
}
long time = System.nanoTime() - start;
return time;
}
public static long testChained(String x, String y, String z) {
long start = System.nanoTime();
for (int i = 0; i < RUNS; i++) {
StringBuilder s = myStringBuilder();
s.append(x);
s.append(y);
s.append(z);
dontOptimiseAway = s.toString();
}
long time = System.nanoTime() - start;
return time;
}
static String dontOptimiseAway = null;
public static void main(String... args) {
for (int i = 0; i < 10; i++) {
long time1 = testSeparate("x", "y", "z");
long time2 = testChained("x", "y", "z");
System.out.printf("Average time separate %.1f ns, chained %.1f ns%n",
(double) time1 / RUNS, (double) time2 / RUNS);
}
}
}
Java7アップデート4を使用
Average time separate 49.8 ns, chained 49.0 ns
Average time separate 50.7 ns, chained 49.3 ns
Average time separate 46.9 ns, chained 46.5 ns
Average time separate 46.6 ns, chained 46.4 ns
Average time separate 46.6 ns, chained 46.6 ns
Average time separate 47.6 ns, chained 47.3 ns
Average time separate 46.7 ns, chained 47.2 ns
Average time separate 46.7 ns, chained 47.0 ns
Average time separate 46.0 ns, chained 46.6 ns
Average time separate 46.7 ns, chained 46.3 ns
Java7アップデート10を使用
Average time separate 50.4 ns, chained 50.0 ns
Average time separate 50.1 ns, chained 50.1 ns
Average time separate 45.9 ns, chained 46.5 ns
Average time separate 46.6 ns, chained 46.7 ns
Average time separate 46.3 ns, chained 46.4 ns
Average time separate 46.7 ns, chained 46.5 ns
Average time separate 46.2 ns, chained 46.4 ns
Average time separate 46.6 ns, chained 46.0 ns
Average time separate 46.4 ns, chained 46.2 ns
Average time separate 45.9 ns, chained 46.2 ns
最初はわずかなバイアスがあるように見えるかもしれませんが、アップデート10を実行した場合、時間の経過とともに明らかなバイアスはありません。