[〜#〜]更新[〜#〜]
コメント全体を通して、私が取ったベンチマークのアプローチは正しくないことが判明したため、結果は誤解を招くものでした。 (受け入れられた回答のように)私のアプローチを修正した後の結果は予想通りです-JDK 13のパフォーマンスはJDK 11と同じくらい良好です。詳細については回答を参照してください。
元の質問
JMHの次のテストコードを使用して、Windows 10のHashSetでいくつかのパフォーマンスベンチマークを行っていました。
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1, warmups = 1)
public void init() {
HashSet<String> s = new HashSet<>();
for (int i = 0; i < 1000000; i++) {
s.add(Math.random() + "");
}
s.size();
}
さまざまなJDKバージョンでコンパイルして実行したところ、次のような結果が得られました。
ヒープサイズを変えてテストしました(したがって、JDKごとに3つの異なる色)。 JDK 14はもちろん、今日からのプレリリースのスナップショットです-WindowsでZGCのパフォーマンスを確認するためだけです。
疑問に思います-JDK 11以降はどうなりましたか? (JDK 12の場合、上のチャートには存在していませんが、すでに成長を始めています)
コメントの提案をありがとうございました。
答えは、おそらくMath.random()
またはHashSet
であるか、Blackhole::consume
がないか、すべての組み合わせでした。テストを単純にi + "aaaaaaaaa"
に変更し、HashSet
をArrayList
に置き換えて、すべての値が入力されるように適切なサイズで事前初期化しました。また、最後にBlackhole::consume
を追加して、不要なJIT最適化を除外しました。
その後、タイミングはJDK 8から11に徐々に低下し、JDK 11-13の間でほぼ同じままです。 JDK 14では少し高くなっていますが、まだリリースされていません。