Mystifying microbenchmark result for stream API on Java 12 vs. Java 8 with -gc true
2022-08-31 17:42:29
作为我对在流中使用复杂过滤器或多个过滤器之间的差异进行调查的一部分,我注意到Java 12的性能比Java 8低得多。
对于这些奇怪的结果,有什么解释吗?我在这里错过了什么吗?
配置:
-
爪哇 8
- OpenJDK 运行时环境 (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
- OpenJDK 64 位服务器 VM(内部版本 25.181-b13,混合模式)
-
爪哇 12
- OpenJDK 运行时环境(生成 12+33)
- OpenJDK 64 位服务器 VM(内部版本 12+33,混合模式,共享)
虚拟机选项:
-XX:+UseG1GC
-server
-Xmx1024m
-Xms1024m
- 中央处理器:8 核
JMH 吞吐量结果:
- 预热:10 次迭代,每次 1 秒
- 测量:10 次迭代,每次 1 秒
- 线程:1 个线程,将同步迭代
- 单位:运算/秒
法典
流 + 复杂过滤器
public void complexFilter(ExecutionPlan plan, Blackhole blackhole) {
long count = plan.getDoubles()
.stream()
.filter(d -> d < Math.PI
&& d > Math.E
&& d != 3
&& d != 2)
.count();
blackhole.consume(count);
}
流 + 多个过滤器
public void multipleFilters(ExecutionPlan plan, Blackhole blackhole) {
long count = plan.getDoubles()
.stream()
.filter(d -> d > Math.PI)
.filter(d -> d < Math.E)
.filter(d -> d != 3)
.filter(d -> d != 2)
.count();
blackhole.consume(count);
}
平行流+复杂滤波器
public void complexFilterParallel(ExecutionPlan plan, Blackhole blackhole) {
long count = plan.getDoubles()
.stream()
.parallel()
.filter(d -> d < Math.PI
&& d > Math.E
&& d != 3
&& d != 2)
.count();
blackhole.consume(count);
}
并行流 + 多个过滤器
public void multipleFiltersParallel(ExecutionPlan plan, Blackhole blackhole) {
long count = plan.getDoubles()
.stream()
.parallel()
.filter(d -> d > Math.PI)
.filter(d -> d < Math.E)
.filter(d -> d != 3)
.filter(d -> d != 2)
.count();
blackhole.consume(count);
}
老式的java迭代
public void oldFashionFilters(ExecutionPlan plan, Blackhole blackhole) {
long count = 0;
for (int i = 0; i < plan.getDoubles().size(); i++) {
if (plan.getDoubles().get(i) > Math.PI
&& plan.getDoubles().get(i) > Math.E
&& plan.getDoubles().get(i) != 3
&& plan.getDoubles().get(i) != 2) {
count = count + 1;
}
}
blackhole.consume(count);
}
您可以通过运行 docker 命令自行尝试:
对于 Java 8:
docker run -it volkodav/java-filter-benchmark:java8
对于 Java 12:
docker run -it volkodav/java-filter-benchmark:java12
源代码: