JDK 11 对比 JDK 13 表现
JDK 11 vs JDK 13 performance
更新
通过评论发现我采用的基准测试方法不正确,因此结果具有误导性。纠正我的方法后(如已接受的答案)结果如预期 - JDK 13 性能与 JDK 11 一样好。有关更多详细信息,请参见答案。
原题
我在 Windows 10 下对 HashSet 进行了一些性能基准测试,使用以下 JMH 测试代码:
@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 当然是今天的预发布快照 - 只是为了看看 ZGC 在 Windows 下的表现。
我想知道 - JDK 11 之后发生了什么? (请注意,对于 JDK 12,它已经开始增长,即使它没有出现在上面的图表中)
感谢大家在评论中提出建议
答案很可能是 Math.random()
或 HashSet
,或者缺少 Blackhole::consume
或所有答案的组合。我将测试更改为简单地执行 i + "aaaaaaaaa"
并将 HashSet
替换为 ArrayList
并预先初始化为适当的大小以适应所有要填充的值。我还在末尾添加了 Blackhole::consume
以排除不需要的 JIT 优化。
所有这些之后,时间从 JDK 8 逐渐下降到 11,然后在 JDK 11-13 之间保持大致相同。在 JDK 14 中,它略有升高,但好吧 - 它尚未发布。
更新
通过评论发现我采用的基准测试方法不正确,因此结果具有误导性。纠正我的方法后(如已接受的答案)结果如预期 - JDK 13 性能与 JDK 11 一样好。有关更多详细信息,请参见答案。
原题
我在 Windows 10 下对 HashSet 进行了一些性能基准测试,使用以下 JMH 测试代码:
@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 当然是今天的预发布快照 - 只是为了看看 ZGC 在 Windows 下的表现。
我想知道 - JDK 11 之后发生了什么? (请注意,对于 JDK 12,它已经开始增长,即使它没有出现在上面的图表中)
感谢大家在评论中提出建议
答案很可能是 Math.random()
或 HashSet
,或者缺少 Blackhole::consume
或所有答案的组合。我将测试更改为简单地执行 i + "aaaaaaaaa"
并将 HashSet
替换为 ArrayList
并预先初始化为适当的大小以适应所有要填充的值。我还在末尾添加了 Blackhole::consume
以排除不需要的 JIT 优化。
所有这些之后,时间从 JDK 8 逐渐下降到 11,然后在 JDK 11-13 之间保持大致相同。在 JDK 14 中,它略有升高,但好吧 - 它尚未发布。